1

我在尝试在两个浏览器(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循环错误。

4

3 回答 3

1

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

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

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

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

  • 铬转换器
  • 火狐转换器

在您的 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);
 }
于 2019-08-02T15:46:15.453 回答
0

for循环在第一次运行时打开 Chrome (browser=1),然后在第二次运行时打开 Firefox (browser=2),然后在最后打开的浏览器 (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
于 2019-08-02T10:29:44.517 回答
0

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

在任何情况下,您都需要重构您的测试以至少遵循并行测试 - 最佳实践:

  1. 从 WebDriver 声明中删除static修饰符
  2. 考虑将您的 WebDriver 实例放入线程本地存储中,否则您将发生冲突
于 2019-08-03T11:53:08.567 回答