运行 用于 IE、firefox、chrome 使用 @DataProvider 的 Selenium 脚本,但它仅同时调用一个浏览器三次;使用 TestNG
Running Selenium script for IE, firefox, chrome using @DataProvider but it is invoking only one browser thrice parallely; Using TestNG
我正在学习 Selenium Grid 并在我的机器上启动了 HUB 和 Node。
我的机器配置是:
OS: Windows8.1
FF 版本:38.0.5
Chrome版本:43.0
IE 版本:11
集线器:
java -jar selenium-server-standalone-2.45.0.jar -role hub
节点:
java -Dwebdriver.chrome.driver=C:\Third_Party_Browser_Drivers\chromedriver.exe -Dwebdriver.ie.driver=C:\Third_Party_Browser_Drivers\IEDriverServer.exe -jar selenium-server-standalone-2.45.0.jar -role webdriver -hub http://localhost:4444/grid/register -port 5555 -browser browserName=firefox,maxInstances=4 -browser browserName=iexplore,maxInstances=3 -browser browserName=chrome,maxInstances=2 -maxSession 4
我正在尝试借助 TestNG 中的@DataProvider 在所有浏览器中并行执行我的测试。下面是我的代码:
public class TestSample2 {
public static WebDriver driver;
public static DesiredCapabilities capabilities = null;
@Test(dataProvider = "getData")
public void testLogin(String username, String password, String browser) throws MalformedURLException, InterruptedException{
System.out.println(browser);
if (browser.equals("chrome")){
capabilities = DesiredCapabilities.chrome();
capabilities.setBrowserName("chrome");
capabilities.setPlatform(Platform.ANY);
//driver = new RemoteWebDriver(new URL("http://10.0.0.11:5566/wd/hub"), capabilities);
} else if(browser.equals("firefox")){
capabilities = DesiredCapabilities.firefox();
capabilities.setBrowserName("firefox");
capabilities.setPlatform(Platform.ANY);
} else if(browser.equals("iexplore")){
capabilities = DesiredCapabilities.internetExplorer();
capabilities.setBrowserName("iexplore");
capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
capabilities.setPlatform(Platform.WINDOWS);
}
driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
driver.get("http://facebook.com");
Thread.sleep(3000);
driver.findElement(By.xpath("//input[@id='email']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='pass']")).sendKeys(password);
driver.quit();
}
@DataProvider(parallel = true)
public Object[][] getData(){
Object data[][] = new Object[3][3];
//first data
data[0][0] = "meganbody";
data[0][1] = "meganlht";
data[0][2] = "firefox";
//second data
data[1][0] = "megan";
data[1][1] = "megaight";
data[1][2] = "chrome";
//third data
data[2][0] = "megdy";
data[2][1] = "anlight";
data[2][2] = "iexplore";
return data;
}
}
我的 testng.xml 文件是:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNG Learning" parallel="tests" thread-count="3" >
<test name="test_FF">
<classes>
<class name="Grid.TestSample2" ></class>
</classes>
</test>
</suite>
当我 运行 将 xml 文件作为 TestNG 时,我收到的输出为:
chrome
iexplore
firefox
测试用例成功。但是当我看到 Grid/console 时,它只显示 "one browser" 被调用;无论是 IE、FF 还是 chrome(因为我 运行 它有好几次)有 3 个实例。例如:并行调用IE浏览器三次。
我不明白我哪里错了。任何帮助!!
您有一个静态网络驱动程序对象。如果您 运行 并行,则相同的对象将被覆盖。 Dataprovider 正在正确传递数据,但驱动程序对象在您的所有测试中都被重用。由于对象共享,我希望您的测试随机失败。
要么将驱动程序对象放在@Test 范围内,要么考虑使用 threadlocal 来避免在线程之间共享驱动程序对象。
我正在学习 Selenium Grid 并在我的机器上启动了 HUB 和 Node。
我的机器配置是:
OS: Windows8.1
FF 版本:38.0.5
Chrome版本:43.0
IE 版本:11
集线器:
java -jar selenium-server-standalone-2.45.0.jar -role hub
节点:
java -Dwebdriver.chrome.driver=C:\Third_Party_Browser_Drivers\chromedriver.exe -Dwebdriver.ie.driver=C:\Third_Party_Browser_Drivers\IEDriverServer.exe -jar selenium-server-standalone-2.45.0.jar -role webdriver -hub http://localhost:4444/grid/register -port 5555 -browser browserName=firefox,maxInstances=4 -browser browserName=iexplore,maxInstances=3 -browser browserName=chrome,maxInstances=2 -maxSession 4
我正在尝试借助 TestNG 中的@DataProvider 在所有浏览器中并行执行我的测试。下面是我的代码:
public class TestSample2 {
public static WebDriver driver;
public static DesiredCapabilities capabilities = null;
@Test(dataProvider = "getData")
public void testLogin(String username, String password, String browser) throws MalformedURLException, InterruptedException{
System.out.println(browser);
if (browser.equals("chrome")){
capabilities = DesiredCapabilities.chrome();
capabilities.setBrowserName("chrome");
capabilities.setPlatform(Platform.ANY);
//driver = new RemoteWebDriver(new URL("http://10.0.0.11:5566/wd/hub"), capabilities);
} else if(browser.equals("firefox")){
capabilities = DesiredCapabilities.firefox();
capabilities.setBrowserName("firefox");
capabilities.setPlatform(Platform.ANY);
} else if(browser.equals("iexplore")){
capabilities = DesiredCapabilities.internetExplorer();
capabilities.setBrowserName("iexplore");
capabilities.setCapability(InternetExplorerDriver.IGNORE_ZOOM_SETTING, true);
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
capabilities.setPlatform(Platform.WINDOWS);
}
driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
driver.get("http://facebook.com");
Thread.sleep(3000);
driver.findElement(By.xpath("//input[@id='email']")).sendKeys(username);
driver.findElement(By.xpath("//input[@id='pass']")).sendKeys(password);
driver.quit();
}
@DataProvider(parallel = true)
public Object[][] getData(){
Object data[][] = new Object[3][3];
//first data
data[0][0] = "meganbody";
data[0][1] = "meganlht";
data[0][2] = "firefox";
//second data
data[1][0] = "megan";
data[1][1] = "megaight";
data[1][2] = "chrome";
//third data
data[2][0] = "megdy";
data[2][1] = "anlight";
data[2][2] = "iexplore";
return data;
}
}
我的 testng.xml 文件是:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNG Learning" parallel="tests" thread-count="3" >
<test name="test_FF">
<classes>
<class name="Grid.TestSample2" ></class>
</classes>
</test>
</suite>
当我 运行 将 xml 文件作为 TestNG 时,我收到的输出为:
chrome
iexplore
firefox
测试用例成功。但是当我看到 Grid/console 时,它只显示 "one browser" 被调用;无论是 IE、FF 还是 chrome(因为我 运行 它有好几次)有 3 个实例。例如:并行调用IE浏览器三次。
我不明白我哪里错了。任何帮助!!
您有一个静态网络驱动程序对象。如果您 运行 并行,则相同的对象将被覆盖。 Dataprovider 正在正确传递数据,但驱动程序对象在您的所有测试中都被重用。由于对象共享,我希望您的测试随机失败。
要么将驱动程序对象放在@Test 范围内,要么考虑使用 threadlocal 来避免在线程之间共享驱动程序对象。