I imported an old project from that has a class named "TestGebSpec". The test cases of it were running on the same browser so I added a "CachingDriverFactory.clearCacheAndQuitDriver()" to gebConfig.groovy file. Still, test cases were running on the same browser so I create a new groovy test case file "Login TC"
Now the problem is the test case of Login TC are running on a separate browser i.e for each test case a new driver is initiated but for file "TestGebSpec" somehow TC runs on the same browser
Any suggestions???
Code of "TestGebSpec" file
@Stepwise
@SuppressWarnings(["GrUnresolvedAccess", "GroovyAssignabilityCheck", "UnnecessaryQualifiedReference"])
class KohlerSanityTestGebSpec extends GebReportingSpec {
public static final String USER_EMAIL = "test_user." + UUID.randomUUID() + "@kohler.com"
public static final String USER_PASSWORD = "pass123Word"
@Shared
productAddedToFolder
def setupSpec() {
driver.manage().window().maximize()
}
def setup() {}
def cleanup() {}
def cleanupSpec() {}
//--------------------------------------------------------------
// Utility methods start here.
//--------------------------------------------------------------
/** Using javascript runner to scroll an element into view so selenium can work with it. */
protected void scrollIntoViewJS(NonEmptyNavigator element) {
((JavascriptExecutor) driver).executeScript(
"arguments[0].scrollIntoView(true);",
element.firstElement());
sleep(1000)
}
protected void scrollUp(int distance) {
((JavascriptExecutor) driver).executeScript("scroll( 0, ${-distance});");
sleep(100)
}
protected void scrollDown(int distance) {
((JavascriptExecutor) driver).executeScript("scroll( 0, ${distance});");
sleep(100)
}
protected void hoverTest2(NonEmptyNavigator element) {
((JavascriptExecutor) driver).executeScript(
"arguments[0].trigger(\"hover\");",
element.firstElement());
}
protected void hoverOver(String path) {
org.openqa.selenium.WebElement element =
driver.findElement(org.openqa.selenium.By.cssSelector(path))
hoverOver(element)
}
protected void hoverOver(NonEmptyNavigator element) {
org.openqa.selenium.interactions.Actions builder = new
org.openqa.selenium.interactions.Actions(driver)
builder.moveToElement(element.getElement(0)).build().perform()
}
/** click, when the click() method does not work. */
@SuppressWarnings("GroovyUnusedDeclaration")
protected void clickElement(NonEmptyNavigator element) {
org.openqa.selenium.interactions.Actions builder = new org.openqa.selenium.interactions.Actions(driver)
builder.moveToElement(element.getElement(0)).click().build().perform()
}
protected void moveElement(NonEmptyNavigator handleElement, NonEmptyNavigator trackElement, int xPercent) {
org.openqa.selenium.WebElement handle = handleElement.getElement(0)
org.openqa.selenium.WebElement track = trackElement.getElement(0)
org.openqa.selenium.interactions.Actions builder = new org.openqa.selenium.interactions.Actions(driver)
int width = track.getSize().getWidth()
int moveLength = width * xPercent / 100
builder.dragAndDropBy(handle as org.openqa.selenium.WebElement, moveLength.intValue(), (int) 0).build().perform()
}
protected void closeSurveyPopup() {
if ($("#IPEbgCover")) {
$("area", alt: "close").click()
}
}
//----------------------------------------------------------------
// End of utility methods. Start of feature methods.
//----------------------------------------------------------------
def "Create project in bCC TESTCASE1"() {
browser.baseUrl = "URL"
when: "I log in to the BCC"
to BccLoginPage
loginForm.login = "data"
loginForm.$("#loginPassword").value("data")
$("input", type: "submit").click()
then:
at BccHomePage
when:
newCaProjectButton.click()
then:
at BccNewCaProject01Page
when: "I name and describe the new project."
def newProjectName = "gebtest-" + randomString(16, ('A'..'Z') + ('0'..'9'))
println "Creating BCC project \"$newProjectName\"."
projectNameInput.value(newProjectName)
projectDescriptionInput.value(randomString(50))
createProcessButton.click()
then:
at BccCaProjectDetailsPage
}
}
code of "Login TC" file
class LoginTC extends GebReportingSpec{
def setupSpec() {
driver.manage().window().maximize()
//driver.manage().window().size = new org.openqa.selenium.Dimension( 1200, 1200 )
} // run before the first feature method
def setup() {} // run before every feature method
def cleanup() {} // run after every feature method
def cleanupSpec() {} // run after the last feature method
void "login tc2"(){
setup:
to HomePage
final String searchString = "string data"
searchInput = searchString
when:
btnSearch.click()
then:
at waitFor{ ProductDetailPage }
and:
sku.text().toLowerCase().contains( searchString.toLowerCase() )
}
void "login tc3"(){
setup:
to HomePage
final String searchString = "string data"
searchInput = searchString
when:
btnSearch.click()
then:
at waitFor{ ProductDetailPage }
}
}
In short problem is why features on "TestGebSpec" file runs on same browser
Flow is as below
1.Open browser
2.Feature 1 run
3.Feature 2 run
.
.
.
final point. Browser close
What I except
1.open browser
2.Feature 1 run
3.Close browser
4.Open browser
5.Feature 2 run
6.Close browser
Actually an error on your web page should not be a problem if the next feature opens the initial URL it needs afresh. Also cookies should not be a problem because you can delete them manually or automatically. Over-using @Stepwise
is a source of problems for many users, too. You should avoid it whenever possible. I even see you use it in a specification with only one feature (or maybe you only showed me one and actually there are more). Using many browsers is a huge resource waste and just makes your tests slow. The Book of Geb (manual) is an excellent source of information.
Take a look at implicit lifecycle with regard to clearCookies()
andclearWebStorage()
. Auto-clearing cookies and/or web storage might also be helpful. The same chapter also explains that if you just use CachingDriverFactory.clearCacheAndQuitDriver()
at the end of a feature method (or in cleanup()
if you need it in every feature), the next method will get a new browser instance automatically.
Of course you can quit the browser via quit()
(quits the browser) and close()
(closes current browser window) if you want to start the new browser manually. But implicit driver management is easier to use IMO, so I am just mentioning it for completeness' sake.
Now for a very special case: You can even use something like resetBrowser(); CachingDriverFactory.clearCacheAndQuitDriver()
in the middle of a single feature method like this:
package de.scrum_master.testing
import geb.driver.CachingDriverFactory
import geb.spock.GebReportingSpec
class RestartBrowserIT extends GebReportingSpec {
def "Search web site Scrum-Master.de"() {
when:_ "download page is opened"
go "https://scrum-master.de"
report "welcome page"
then:_ "expected text is found on page"
$("h2").text().startsWith("Herzlich Willkommen bei Scrum-Master.de")
when:_ "browser is reset"
resetBrowser()
CachingDriverFactory.clearCacheAndQuitDriver()
and:_ "download page is opened again in new browser"
go "https://scrum-master.de/Downloads"
report "download page"
then:_ "expected text is found on page"
$("h2").text().startsWith("Scrum on a Page")
}
}
Then on the console you see something like this:
download page is opened
07:49:49.105 [main] INFO i.g.bonigarcia.wdm.WebDriverManager - Using chromedriver 83.0.4103.39 (since Google Chrome 83 is installed in your machine)
07:49:49.146 [main] INFO i.g.bonigarcia.wdm.WebDriverManager - Exporting webdriver.chrome.driver as C:\Users\alexa\.m2\repository\webdriver\chromedriver\win32\83.0.4103.39\chromedriver.exe
Starting ChromeDriver 83.0.4103.39 (ccbf011cb2d2b19b506d844400483861342c20cd-refs/branch-heads/4103@{#416}) on port 3302
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
Jul 03, 2020 7:49:53 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Detected dialect: W3C
expected text is found on page
browser is reset
download page is opened again in new browser
07:49:57.387 [main] INFO i.g.bonigarcia.wdm.WebDriverManager - Using chromedriver 83.0.4103.39 (since Google Chrome 83 is installed in your machine)
07:49:57.413 [main] INFO i.g.bonigarcia.wdm.WebDriverManager - Exporting webdriver.chrome.driver as C:\Users\alexa\.m2\repository\webdriver\chromedriver\win32\83.0.4103.39\chromedriver.exe
Starting ChromeDriver 83.0.4103.39 (ccbf011cb2d2b19b506d844400483861342c20cd-refs/branch-heads/4103@{#416}) on port 27426
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
Jul 03, 2020 7:50:00 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Detected dialect: W3C
expected text is found on page
P.S.: Just in case you are wondering why I write when:_ "label"
instead of just when: "label"
, I use this SpockConfig.groovy
file in order to help me print labels in my test, as you can also see in the console log above:
import spock.lang.Specification
/**
* Use like this in order to print Spock/Geb labels:
* given:_ "foo"
* when:_ "bar"
* then:_ "zot"
*/
class LabelPrinter {
def _(def message) {
println message
true
}
}
Specification.mixin LabelPrinter
The Spock configuration file should be in src/main/resources/SpockConfig.groovy
if you use a standard Maven directory layout.