【问题标题】:When trying to run Selenium Cucumber test in two browsers, test runs in only one browser尝试在两个浏览器中运行 Selenium Cucumber 测试时,测试仅在一个浏览器中运行
【发布时间】:2019-08-02 09:42:00
【问题描述】:

我在尝试在两个浏览器(Chrome、Firefox)中运行 selenium cucumber java 脚本时卡住了。当我使用单个浏览器时,测试工作正常。我使用 selenium PageFactory 类来初始化 web 元素。

问题是当我对两个浏览器运行测试时,第一个浏览器打开,导航到 URL,然后什么也没有发生。 Web 元素未初始化。测试转到第二个浏览器,导航到 URL,初始化 Web 元素,后续测试方法 (testMethod1) 按预期运行。为什么测试没有在第一个浏览器上运行?

这是包含 Web 元素的 PageFactory BasePage 类:

public class BasePage {       
private final WebDriver driver;  

public BasePage(WebDriver driver) {this.driver = driver;} //constructor


 @FindBy(id = "cc-amount")
 public WebElement amountField;

这是测试类以及我如何尝试在两个浏览器中运行测试:

public class Convert {

  private static WebDriver driver;
  private final BaseUtil baseUtil = new BaseUtil();
  private static BasePage basePage;
  private static int browser;



 public void navigateToUrl(String url) throws InterruptedException {  
for (browser = 1; browser <= 2; browser++) {

  if (browser == 1) {
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();

  } else if (browser == 2) {
    WebDriverManager.firefoxdriver().setup();
    driver = new FirefoxDriver();
  }

  driver.get(baseUtil.getMyUrl()); //Url coming from a utility class
  driver.manage().window().maximize();
  driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  basePage = PageFactory.initElements(driver, BasePage.class); //initialisation of the BasePage class conttaining the pagefactory web elements

浏览器初始化后,此方法在第二个浏览器(Firefox)中运行正常,但在第一个浏览器(Chrome)中根本没有运行:

  public void testMetod1(String amount) throws InterruptedException {
  basePage.amountField.click();

我怀疑无法在一次运行中为两个浏览器启动 PageFacory,但我不知道如何进一步诊断。也可能是for 循环错误。

【问题讨论】:

    标签: java selenium-webdriver cucumber-jvm page-factory


    【解决方案1】:

    我认为这是一个同步问题。只需为每个浏览器创建一个类,然后您可以创建另一个包含所有共享代码的基类。

    为每个浏览器创建一个类会给您带来一些好处:

    1. 更清洁的代码。
    2. 您的测试将并行运行。
    3. 特定浏览器的特定测试用例(IE 专用)。
    4. 解决此同步问题。

    所以基本上不用转换器,你可以创建:

    • Chrome 转换器
    • Firefox 转换器

    在您的 TestExecuter 类中,只需为每个实例创建实例并运行您的测试。

    更详细地说,您使用的是一个类Convert,其中有两个静态变量:

      private static WebDriver driver;
      private static BasePage basePage;
    

    从 BasePage 类中删除 static 关键字不会解决根本原因,因为您使用 BasePage 这是一个静态类并且不能实例化为实例类并且它位于外部库中,因此您需要将类分隔为一种包装器。

    在这里,您尝试对 Chrome 和 Firefox 使用完全相同的初始化,这将无法并行工作,甚至无法在 for 循环中工作,直到您可以等待第一个测试然后处理它并初始化与第二个测试相关的所有内容再次。

    所以正确的做法是像这样为每个浏览器创建一个单独的转换:

    ChromeConverter
    FirefoxConverter
    

    在您的 TestExecuter 中,您只需要初始化每个并使用它,就像这样:

     @Given("...")
     public void navigateToUrl(String url) throws InterruptedException {
       chromeConverterApp.navigateToUrl(url);
       firefoxConverterApp.navigateToUrl(url);
     }
     @When("^..")
     public void enterCurrencies(String amount, String from, String to) throws InterruptedException {
       chromeConverterApp.enterCurrencies(amount, from, to);
       firefoxConverterApp.enterCurrencies(amount,from,to);
     }
    

    【讨论】:

    • 我没有考虑过这种方法,但我已经尝试过了,它就像一个魅力。尽管创建单独的类添加了样板代码,但是,目前,该方法可以完成工作并且系统的行为方式符合我的预期。
    【解决方案2】:

    for 循环在第一次运行 (browser=1) 时打开 Chrome,然后在第二次运行 (browser=2) 时打开 Firefox,然后在最后一次打开的浏览器 (Firefox) 上继续测试。

    如果您希望在两个浏览器上运行完整的测试,您需要将测试的其余部分放在 for 循环中。

    基本上,你有类似的东西:

    public void navigateToUrl(String url) throws InterruptedException {  
    for (browser = 1; browser <= 2; browser++) {
        //body of the for loop
    }
    //some more code
    } //end of navigateToUrl
    

    您需要将其更改为:

    public void navigateToUrl(String url) throws InterruptedException {  
    for (browser = 1; browser <= 2; browser++) {
        //body of the for loop
    }
    //some more code
    testMethod1()
    } //end of navigateToUrl
    

    【讨论】:

    • 我试过这样做,但到处都是红色波浪形错误。您能否通过使用问题中提供的源代码来演示我如何实现您的建议?
    • 红色波浪形错误说明了什么?检查更新的答案。
    • 悬停时,一些错误显示为Cannot resolve symbol。别人说Expression expected
    • 我尝试了您改进的答案,但我得到了带有错误Cannot resolve symbol 'amount' 的红色波浪线。
    • TestMethod1() 是否在 Convert 类中?另外,发布完整的错误跟踪。
    【解决方案3】:

    您的方法不正确,如果您需要并行运行测试,您应该选择Selenium Grid 或考虑实现其他多线程选项,即:

    无论如何,您至少需要重构您的测试以遵循Parallel Tests - Best Practices

    1. 从 WebDriver 声明中删除 static 修饰符
    2. 考虑将您的 WebDriver 实例放入Thread Local Storage,否则您将发生冲突

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 2012-08-03
      • 2014-01-17
      • 1970-01-01
      • 2012-04-03
      • 2010-09-17
      • 1970-01-01
      • 2014-12-27
      相关资源
      最近更新 更多