首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GEB :一个类测试用例不能在单独的浏览器中打开

GEB :一个类测试用例不能在单独的浏览器中打开
EN

Stack Overflow用户
提问于 2020-07-02 07:49:59
回答 1查看 296关注 0票数 0

我从其中导入了一个具有一个名为"TestGebSpec“的类的旧项目。它的测试用例运行在同一个浏览器上,所以我在gebConfig.groovy文件中添加了一个gebConfig.groovy。尽管如此,测试用例仍然运行在同一个浏览器上,因此我创建了一个新的groovy测试用例文件"Login TC“。

现在的问题是Login的测试用例在一个单独的浏览器上运行,即对于每个测试用例启动一个新的驱动程序,但是对于文件"TestGebSpec“,TC在同一个浏览器上运行。

有什么建议吗?

代码"TestGebSpec“文件

代码语言:javascript
运行
复制
@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
  }
}

“登录TC”文件代码

代码语言:javascript
运行
复制
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 }

    }

}

简而言之,的问题是为什么"TestGebSpec“文件上的特性在同一个浏览器上运行。

流量如下

1.开放浏览器

2.特性1运行

3.特性2运行

最后一点。浏览器关闭

我除了

1.开放浏览器

2.特性1运行

3.关闭浏览器

4.开放浏览器

5.特性2运行

6.关闭浏览器

EN

Stack Overflow用户

回答已采纳

发布于 2020-07-03 00:57:16

实际上,如果下一个特性重新打开它需要的初始URL,那么网页上的错误就不会成为问题。此外,cookie不应该是一个问题,因为您可以手动或自动删除它们。对许多用户来说,过度使用@Stepwise也是一个问题来源。只要有可能,你都应该避免。我甚至看到您在只有一个特性的规范中使用它(或者您只向我展示了一个功能,实际上还有更多功能)。使用许多浏览器是一种巨大的资源浪费,只会使您的测试变得缓慢。“Geb书”(手册)是一个极好的信息来源。

看看隐生命周期中的clearCookies()clearWebStorage()自动清除cookie和/或web存储也可能有帮助。同一章还解释说,如果您只在一个功能方法的末尾使用CachingDriverFactory.clearCacheAndQuitDriver() (或者在cleanup()中使用它,如果您在每个特性中都需要它),那么下一个方法将自动获得一个新的浏览器实例。

当然,如果您想手动启动新浏览器,可以通过退出浏览器 (退出浏览器)和close() (关闭当前浏览器窗口)。但是隐式驱动程序管理更容易使用IMO,所以为了完整起见,我只提到它。

现在,对于一个非常特殊的情况:您甚至可以在单个特性方法的中间使用类似于resetBrowser(); CachingDriverFactory.clearCacheAndQuitDriver()的东西,如下所示:

代码语言:javascript
运行
复制
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")
  }
}

然后在控制台上可以看到如下所示:

代码语言:javascript
运行
复制
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.:如果您想知道为什么我写的是when:_ "label"而不是when: "label",我使用这个SpockConfig.groovy文件来帮助我在测试中打印标签,正如您在上面的控制台日志中所看到的那样:

代码语言:javascript
运行
复制
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

如果您使用标准的Maven目录布局,那么Spock配置文件应该在src/main/resources/SpockConfig.groovy中。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62691520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档