selenium grid/cucumber 和 docker 组成:运行 多个节点上的并行测试
selenium grid/cucumber and docker compose: run a parallel test on several nodes
为了在上述技术方面训练自己,我创建了一个项目,其中包含一个测试,用于检查用户在 Whosebug 站点主页上的导航。
selenium 网格的集线器和 3 个节点似乎已正确配置
测试 运行 正确,我现在想 运行 在多个浏览器上同时进行此测试。
我这样写我的测试:
黄瓜:
Feature: search the home page of Whosebug
Scenario: Go to the site Whosebug
Given I'm on google search page
When I enter the name of the site
Then I'm navigated on the home page of Whosebug
硒:
public class StepGoWhosebugChrome {
RemoteWebDriver driver;
String nodeUrl;
@Given("I'm on google search page")
public void i_m_on_google_search_page() {
try {
nodeUrl = "http://localhost:4444";
ChromeOptions options = new ChromeOptions();
// options.addArguments("--headless");
options.addArguments("start-maximized");
driver = new RemoteWebDriver(new URL(nodeUrl), options);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
driver.get("https://www.google.com");
} catch (MalformedURLException error) {
error.printStackTrace();
}
}
@When("I enter the name of the site")
public void i_enter_the_name_of_the_site() {
WebElement webElementList = driver.findElement(By.id("L2AGLb"));
webElementList.click();
driver.findElement(By.name("q")).sendKeys("Whosebug", Keys.ENTER);
}
@Then("I'm navigated on the home page of Whosebug")
public void i_m_navigated_on_the_home_page_of_Whosebug() {
driver.findElement(By.xpath("//a[@href='https://whosebug.com/']")).click();
driver.close();
}
}
最后 docker 文件包含启动 3 个容器,其中包含 Web 驱动程序 chrome、firefox 和 edge 的图像:
version: "3"
services:
chrome:
image: selenium/node-chrome:4.1.1-20211217
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=2
edge:
image: selenium/node-edge:4.1.1-20211217
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=3
firefox:
image: selenium/node-firefox:4.1.1-20211217
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=3
selenium-hub:
image: selenium/hub:4.1.1-20211217
container_name: selenium-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
我终于运行 docker 和命令组成了:
docker-compose -f docker-compose.yml up
我通过修改 FireFoxOption
和 InterneExplorerOptions
对 ChromeOptions
的使用来复制测试 class,希望测试能够开始,但我有疑问。这会产生以下错误:
Exception in thread "main" io.cucumber.core.exception.CucumberException:
io.cucumber.core.runner.DuplicateStepDefinitionException: Duplicate step definitions in com.seleniumtest.formation.demo.cucumber.steps.StepGoWhosebugChrome.i_m_on_google_search_page() and com.seleniumtest.formation.demo.cucumber.steps.StepGoWhosebugFirefox.i_m_on_google_search_page()
我知道这会在使用 Cucumber 的测试步骤的定义中造成语言歧义。你有教程或想法供我考虑吗?
谢谢
我在 Java + testng + cucumber 的帮助下实现了类似的事情。 testng.xml 带有 3 个 <test>
标签,同时进行 <parameter>
和 运行 测试。 For.eg.,
<suite name="parallel" parallel="tests" thread-count="5">
<test name="chrome>
<parameter name="browser" value="chrome"/>
<classes>
<class name="YOUR.CLASS.PATH"/>
</classes>
</test>
<test name="firefox>
<parameter name="browser" value="firefox"/>
<classes>
<class name="YOUR.CLASS.PATH"/>
</classes>
</test>
<test name="edge>
<parameter name="browser" value="edge"/>
<classes>
<class name="YOUR.CLASS.PATH"/>
</classes>
</test>
并根据 browser
的值,您可以设置功能
@Parameter("browser")
@BeforeMethod
public void beforeMethod(String browser) {
if (browser.equals("chrome))
// driver for chrome
// and so on
}
为了在上述技术方面训练自己,我创建了一个项目,其中包含一个测试,用于检查用户在 Whosebug 站点主页上的导航。
selenium 网格的集线器和 3 个节点似乎已正确配置 测试 运行 正确,我现在想 运行 在多个浏览器上同时进行此测试。
我这样写我的测试: 黄瓜:
Feature: search the home page of Whosebug
Scenario: Go to the site Whosebug
Given I'm on google search page
When I enter the name of the site
Then I'm navigated on the home page of Whosebug
硒:
public class StepGoWhosebugChrome {
RemoteWebDriver driver;
String nodeUrl;
@Given("I'm on google search page")
public void i_m_on_google_search_page() {
try {
nodeUrl = "http://localhost:4444";
ChromeOptions options = new ChromeOptions();
// options.addArguments("--headless");
options.addArguments("start-maximized");
driver = new RemoteWebDriver(new URL(nodeUrl), options);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
driver.get("https://www.google.com");
} catch (MalformedURLException error) {
error.printStackTrace();
}
}
@When("I enter the name of the site")
public void i_enter_the_name_of_the_site() {
WebElement webElementList = driver.findElement(By.id("L2AGLb"));
webElementList.click();
driver.findElement(By.name("q")).sendKeys("Whosebug", Keys.ENTER);
}
@Then("I'm navigated on the home page of Whosebug")
public void i_m_navigated_on_the_home_page_of_Whosebug() {
driver.findElement(By.xpath("//a[@href='https://whosebug.com/']")).click();
driver.close();
}
}
最后 docker 文件包含启动 3 个容器,其中包含 Web 驱动程序 chrome、firefox 和 edge 的图像:
version: "3"
services:
chrome:
image: selenium/node-chrome:4.1.1-20211217
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=2
edge:
image: selenium/node-edge:4.1.1-20211217
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=3
firefox:
image: selenium/node-firefox:4.1.1-20211217
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=3
selenium-hub:
image: selenium/hub:4.1.1-20211217
container_name: selenium-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
我终于运行 docker 和命令组成了:
docker-compose -f docker-compose.yml up
我通过修改 FireFoxOption
和 InterneExplorerOptions
对 ChromeOptions
的使用来复制测试 class,希望测试能够开始,但我有疑问。这会产生以下错误:
Exception in thread "main" io.cucumber.core.exception.CucumberException:
io.cucumber.core.runner.DuplicateStepDefinitionException: Duplicate step definitions in com.seleniumtest.formation.demo.cucumber.steps.StepGoWhosebugChrome.i_m_on_google_search_page() and com.seleniumtest.formation.demo.cucumber.steps.StepGoWhosebugFirefox.i_m_on_google_search_page()
我知道这会在使用 Cucumber 的测试步骤的定义中造成语言歧义。你有教程或想法供我考虑吗? 谢谢
我在 Java + testng + cucumber 的帮助下实现了类似的事情。 testng.xml 带有 3 个 <test>
标签,同时进行 <parameter>
和 运行 测试。 For.eg.,
<suite name="parallel" parallel="tests" thread-count="5">
<test name="chrome>
<parameter name="browser" value="chrome"/>
<classes>
<class name="YOUR.CLASS.PATH"/>
</classes>
</test>
<test name="firefox>
<parameter name="browser" value="firefox"/>
<classes>
<class name="YOUR.CLASS.PATH"/>
</classes>
</test>
<test name="edge>
<parameter name="browser" value="edge"/>
<classes>
<class name="YOUR.CLASS.PATH"/>
</classes>
</test>
并根据 browser
的值,您可以设置功能
@Parameter("browser")
@BeforeMethod
public void beforeMethod(String browser) {
if (browser.equals("chrome))
// driver for chrome
// and so on
}