如何配置Arquillian无人机以并行使用多个浏览器?

时间:2018-08-29 10:44:09

标签: selenium selenium-webdriver jboss-arquillian arquillian-drone graphene2

我关注了Arquillian multiple browsers,下面是设置

Arquillian.xml

<extension qualifier="webdriver-browser1">
    <property name="browser">firefox</property>
</extension>
<extension qualifier="webdriver-browser2">
    <property name="browser">chrome</property>
</extension>
<extension qualifier="graphene">
    <property name="url">http://localhost:3000</property>
    <property name="waitGuiInterval">6</property>
</extension>

注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Qualifier
public @interface Browser1 {
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Qualifier
public @interface Browser1 {
}

在测试文件中

@Browser1
@Drone
WebDriver browser1;

@Browser2
@Drone
WebDriver browser2;

然后我使用下面的代码打开浏览器

browser1.get(url.toString());
browser2.get(url.toString());

浏览器打开但引发以下异常:

java.lang.IllegalStateException:org.jboss.arquillian.drone.api.annotation.Default和com.poc.testing.cusat.Browser1有一个浏览器交错。

1 个答案:

答案 0 :(得分:0)

使用Selenium Grid可以解决您的问题。 这是有关如何使用它的分步教程: https://www.codementor.io/olawalealadeusi896/setting-up-selenium-grid-to-run-your-tests-in-parallel-on-multiple-browsers-kl6vqi83a

在网站上引用:

  

STEP 1   下载硒独立服务器并将其放置在测试机上的任何目录中,让我们的测试机称为机器A。[...]记下测试机(机器A)的IP地址。

     

STEP 2   [..]如果使用的是窗口os,请打开终端或命令提示符,然后将目录更改为保存在STEP 1中下载的硒独立服务器的位置。然后运行以下命令

java -jar <selenium_standalone_server_file_name_here> -role hub -host <your_ip_here>
     

注意:

     
      
  • 用您的硒独立服务器文件名替换-通常采用selenium-server-standalone-3.5.0.jar(适用于3.5.0版)这种格式。如果您不是从保存硒独立服务器的目录中运行命令,请替换为硒文件路径

  •   
  • 替换为您的IP地址。记住,我曾问过您将IP地址保存在STEP 1中的某个位置,您在此处保存相同的IP。

  •   
  • 通过将集线器传递给-role命令,我们告诉selenium独立服务器这是我们的集线器
  •   
     

[...]

     

注意:复制此URL http://:4444 / grid / register /并将其保存在某个地方,我们将需要它在刚刚启动的该集线器上注册该节点。   要测试集线器是否正在运行-打开浏览器并导航到localhost:4444 / grid / console

     

第3步   从节点说明中记住,我们说节点是将在其上执行测试的集线器实例,并且需要在集线器上注册一个节点。由于我们的测试将在节点上执行,因此我们需要下载所有要在其上执行测试的浏览器驱动程序。浏览器驱动程序特定于每种浏览器,它们是webdriver实现,用于控制本地计算机上各自的浏览器。它们充当本地端和远程端之间的代理。   下载以下内容并将它们放置在计算机B上的同一文件夹中-如果愿意,也可以将它们放置在不同的位置,但只需记下它们的路径即可。

     
      
  • 硒独立服务器-硒jar服务器
  •   
  • chrome驱动程序-Chrome WebDriver实现,用于控制在本地计算机上运行的Chrome浏览器。
  •   
  • Gecko驱动程序-Gecko驱动程序是WebDriver实现,用于控制在本地计算机上运行的gecko浏览器,例如firefox。
  •   
  • IE驱动程序-InternetExplorerDriver是一个独立的服务器,它实现了WebDriver的有线协议,该协议控制本地计算机上的IE浏览器
  •   
     

注意:您可以根据要在其上执行测试的浏览器来决定使用上述任何驱动程序。

     

下载完驱动程序后,如果第二台计算机在Windows操作系统上运行,则可以在C驱动器中创建一个硒文件夹,并将所有驱动程序放入其中。

     

根据情况在计算机B上打开命令提示符或终端,然后运行以下命令启动节点

java -Dwebdriver.chrome.driver="C:\selenium\chromedriver.exe" -Dwebdriver.internetexplorer.driver="C:\selenium\IEDriverServer.exe" -Dwebdriver.gecko.driver="C:\selenium\geckodriver.exe" -jar "C:\selenium\selenium-server-standalone-3.5.0.jar" -role node -hub "http://<your_ip_here>:4444/grid/register/"
     

我们做了什么?

     
      
  • 这是假设您使用的是Windows OS计算机,并且驱动程序位于C驱动程序内的selenium文件夹中。如果您使用的是其他操作系统,或者驱动程序位于与selenium不同的其他文件夹中,则可以从上面的命令更改相应驱动程序的路径。
  •   
  • 用我要求您在STEP 2中复制的URL替换http://:4444 / grid / register /。更改为Machine A IP Address。
  •   
  • 通过将节点传递给-role命令,我们告诉selenium独立服务器这是我们的节点之一
  •   
     

注意:如果不使用虚拟机,则必须在虚拟机或第二台计算机上执行STEP 3。   [...]   您可以通过在机器A浏览器上导航至http://localhost:4444/grid/console来检查机器A的配置,与我们在浏览器上确认集线器是否正在运行时所做的操作一样

     

[...]

     

接下来,在/ src / main / java /中创建一个新包,并将其命名为base(在该包内,我们将创建一个用于安装测试驱动程序的类)。   完成后,在基本包中创建一个Java类,并将其命名为SetupTestDriver。   将以下代码添加到SetupTestDriver类中

     

公共类SetupTestDriver {

private WebDriver driver = null;
private String browser = null;
private String baseUrl = null;
private String os = null;
private String node = null;

public SetupTestDriver(String os, String browser, String baseUrl, String node) throws MalformedURLException {
    this.browser = browser;
    this.os = os;
    this.baseUrl = baseUrl;
    this.node = node;

    Platform platform = Platform.fromString(os.toUpperCase());
    if(browser.equalsIgnoreCase("chrome")) {
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.setCapability("platform", platform);
        this.driver = new RemoteWebDriver(new URL(node + "/wd/hub"), chromeOptions);
    } else if (browser.equalsIgnoreCase("firefox")) {
        FirefoxOptions firefoxOptions = new FirefoxOptions();
        firefoxOptions.setCapability("platform", platform);
        this.driver = new RemoteWebDriver(new URL(node + "/wd/hub"), firefoxOptions);
    } else {
        InternetExplorerOptions ieOption = new InternetExplorerOptions();
        ieOption.setCapability("platform", platform);
        this.driver = new RemoteWebDriver(new URL(node + "/wd/hub"), ieOption);
    }

    this.driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    this.driver.manage().window().maximize();
    this.driver.get(baseUrl);

}

public String getOs() {
    return this.os;
}

public String getBrowser() {
    return this.browser;
}

public String getBaseUrl() {
    return this.baseUrl;
}

public String getNode() {
    return this.node;
}

public WebDriver getDriver() {
    return this.driver;
}
  

}

     

现在我们已经设置了SetupTestDriver类,让我们创建一个简单的Java测试来测试Google搜索框。

     

在src / test / java中创建一个新的测试类,我们可以将其命名为GoogleSearchTest

     

将以下代码添加到类中

     

公共类GoogleSearchTest {

public WebDriver driver;

@BeforeClass(alwaysRun = true)
@Parameters({"os", "browser", "url", "node"})
public void setUp(String os, String browser, String url, String node) throws MalformedURLException {
    SetupTestDriver setupTestDriver = new SetupTestDriver(os, browser, url, node);
    driver = setupTestDriver.getDriver();
}

@Test
public void googleTitleTest() {
    // validate page title test
    Assert.assertTrue(driver.getTitle().contentEquals("Google"));
}

@Test
public void googleUrlTest() {
    // validate current url test
    Assert.assertTrue(driver.getCurrentUrl().contains("www.google.com"));
}

@Test
public void googleSearchButtonTest() {
    // basic test to validate that search button is displayed, enabled and it's value
    WebElement searchButtonElement = driver.findElement(By.name("btnK"));
    Assert.assertTrue(searchButtonElement.isDisplayed());
    Assert.assertTrue(searchButtonElement.isEnabled());
    Assert.assertTrue(searchButtonElement.getAttribute("value").contains("Google Search"));
}

@Test
public void googleFeelingLuckyButtonTest() {
    // basic test to validate that feeling lucky button is displayed, enabled and it's value
    WebElement feelingLuckyElement = driver.findElement(By.name("btnI"));
    Assert.assertTrue(feelingLuckyElement.isDisplayed());
    Assert.assertTrue(feelingLuckyElement.isEnabled());
    Assert.assertTrue(feelingLuckyElement.getAttribute("value").contains("I'm Feeling Lucky"));
}

@Test
public void googleSearchBox() {
    // basic test to validate that search box displayed and enabled
    WebElement searchElement = driver.findElement(By.name("q"));
    Assert.assertTrue(searchElement.isDisplayed());
    Assert.assertTrue(searchElement.isEnabled());
}



@AfterClass(alwaysRun = true)
public void closeBrowser() {
    driver.quit();
}

}