在两个浏览器中尝试 运行 Selenium Cucumber 测试时,仅在一个浏览器中测试 运行s
When trying to run Selenium Cucumber test in two browsers, test runs in only one browser
我在尝试在两个浏览器(Chrome、Firefox)中 运行 selenium cucumber java 脚本时卡住了。当我使用单个浏览器时,测试工作正常。我使用 selenium PageFactory class 来初始化网络元素。
问题是当我 运行 测试两个浏览器时,第一个浏览器打开,导航到 URL 然后没有任何反应。 Web 元素未初始化。测试移至第二个浏览器,导航至 URL,Web 元素已初始化,后续测试方法 (testMethod1
) 运行 符合预期。为什么在第一个浏览器上测试没有 运行ning?
这是包含 Web 元素的 PageFactory BasePage class:
public class BasePage {
private final WebDriver driver;
public BasePage(WebDriver driver) {this.driver = driver;} //constructor
@FindBy(id = "cc-amount")
public WebElement amountField;
这是测试 class 以及我如何尝试 运行 在两种浏览器中进行测试:
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
循环错误。
for
循环在第一个 运行(浏览器=1)上打开 Chrome,然后在第二个 运行(浏览器=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
我认为这是一个同步问题。只需要为每个浏览器创建一个 class,然后您可以创建另一个包含所有共享代码的基础 class。
为每个浏览器创建一个 class 会给你带来一些好处:
- 更简洁的代码。
- 您的测试将 运行 并行进行。
- 针对特定浏览器的特定测试用例(特别针对 IE)。
- 解决这个同步问题。
所以基本上不用转换器,您可以创建:
- Chrome转换器
- Firefox 转换器
在您的 TestExecuter class 中,只需为每个实例和 运行 您的测试创建实例。
更详细地说,您正在使用一个 class Convert
并且在其中有两个静态变量:
private static WebDriver driver;
private static BasePage basePage;
从 BasePage class 中删除静态关键字不会解决根本原因,因为您使用的是静态的 BasePage class 并且无法实例化为实例 class它位于外部库中,因此您需要将 classes 作为包装器分开。
在这里,您尝试使用与 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);
}
您的方法不正确,如果您需要 运行 并行测试,您应该选择 Selenium Grid 或考虑实施其他多线程选项,即:
- 普通 Java: ExecutorService
- JUnit or TestNG: Maven Surefire Plugin Fork Options and Parallel Test Execution
在任何情况下,您都需要重构测试以至少遵循 Parallel Tests - Best Practices:
- 从 WebDriver 声明中删除 static 修饰符
- 考虑将您的 WebDriver 实例放入 Thread Local Storage 否则会发生冲突
我在尝试在两个浏览器(Chrome、Firefox)中 运行 selenium cucumber java 脚本时卡住了。当我使用单个浏览器时,测试工作正常。我使用 selenium PageFactory class 来初始化网络元素。
问题是当我 运行 测试两个浏览器时,第一个浏览器打开,导航到 URL 然后没有任何反应。 Web 元素未初始化。测试移至第二个浏览器,导航至 URL,Web 元素已初始化,后续测试方法 (testMethod1
) 运行 符合预期。为什么在第一个浏览器上测试没有 运行ning?
这是包含 Web 元素的 PageFactory BasePage class:
public class BasePage {
private final WebDriver driver;
public BasePage(WebDriver driver) {this.driver = driver;} //constructor
@FindBy(id = "cc-amount")
public WebElement amountField;
这是测试 class 以及我如何尝试 运行 在两种浏览器中进行测试:
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
循环错误。
for
循环在第一个 运行(浏览器=1)上打开 Chrome,然后在第二个 运行(浏览器=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
我认为这是一个同步问题。只需要为每个浏览器创建一个 class,然后您可以创建另一个包含所有共享代码的基础 class。
为每个浏览器创建一个 class 会给你带来一些好处:
- 更简洁的代码。
- 您的测试将 运行 并行进行。
- 针对特定浏览器的特定测试用例(特别针对 IE)。
- 解决这个同步问题。
所以基本上不用转换器,您可以创建:
- Chrome转换器
- Firefox 转换器
在您的 TestExecuter class 中,只需为每个实例和 运行 您的测试创建实例。
更详细地说,您正在使用一个 class Convert
并且在其中有两个静态变量:
private static WebDriver driver;
private static BasePage basePage;
从 BasePage class 中删除静态关键字不会解决根本原因,因为您使用的是静态的 BasePage class 并且无法实例化为实例 class它位于外部库中,因此您需要将 classes 作为包装器分开。
在这里,您尝试使用与 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);
}
您的方法不正确,如果您需要 运行 并行测试,您应该选择 Selenium Grid 或考虑实施其他多线程选项,即:
- 普通 Java: ExecutorService
- JUnit or TestNG: Maven Surefire Plugin Fork Options and Parallel Test Execution
在任何情况下,您都需要重构测试以至少遵循 Parallel Tests - Best Practices:
- 从 WebDriver 声明中删除 static 修饰符
- 考虑将您的 WebDriver 实例放入 Thread Local Storage 否则会发生冲突