使用selenium web驱动程序在多个浏览器上运行测试

时间:2012-02-26 13:08:25

标签: browser selenium webdriver

我正在尝试通过for循环在多个浏览器上运行相同的测试,但它总是只在Firefox上运行。

bros = ['FIREFOX','CHROME','INTERNET EXPLORER']

for bro in bros:
    print "Running "+bro+"\n"
    browser = webdriver.Remote(
                    command_executor='http://10.236.194.218:4444/wd/hub',
                    desired_capabilities={'browserName': bro,
                                          'javascriptEnabled': True})
    browser.implicitly_wait(60000)
    browser.get("http://10.236.194.156")

一个有趣的观察;当我包含参数platform: WINDOWS时,它只在Internet Explorer上运行。

Selenium Webdriver是以这种方式工作还是我的理解错了?

7 个答案:

答案 0 :(得分:6)

我实际上已经在java中完成了这个,以下对我很有用:

...
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
...

DesiredCapabilities[] browsers = {DesiredCapabilities.firefox(),DesiredCapabilities.chrome(),DesiredCapabilities.internetExplorer()};
    for(DesiredCapabilities browser : browsers)
    {
        try{
            System.out.println("Testing in Browser: "+browser.getBrowserName());
            driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub"), browser);
            ...

如果你用不同的语言编写测试,你需要对此进行调整,我知道它可以用Java编写,但不确定。

另外,我同意你要做的事情,我认为让一个用不同浏览器运行相同测试的类更好,而不是多次复制代码并且不优雅。如果您使用Java /其他代码执行此操作,我还强烈建议您使用Page Object

祝你好运!

答案 1 :(得分:1)

因此,如果我找到了你,那么你就有了一个测试用例,希望对不同的浏览器进行测试。

即使有可能(我不知道atm),我认为循环不是一个好主意。

我们的想法是能够使用特定的浏览器(即JUnit理念)在运行时独立测试每个测试用例,而不是为了访问特定的浏览器而全部运行。

因此,您需要使用特定浏览器和特定测试用例创建WebDriver。

我建议您通过为每个浏览器创建一个测试用例类文件来分隔测试用例。

赞:FirefoxTestOne.java,IeTestOne.java,ChromeTestOne.java。

请注意,您可以在FirefoxTestOne中添加多个firefox测试而不会出现任何问题。不能保证它们将通过(JUnit哲学)按特定顺序执行。

对于链接和教程,请询问谷歌。已经写好了一些例子。

答案 2 :(得分:0)

您必须使用所选的浏览器生成多个测试类(或webdriver实例)。 Webdriver是使用一个浏览器定义的。

答案 3 :(得分:0)

正如Coretek所说,你需要多个webdriver实例。您需要运行selenium-server .jar文件,并为每个文件提供一个参数,指定您希望该服务器实例运行的浏览器。

Internet Explorer的参数是* iexplore,firefox的参数是* firefox,chrome的参数是* chrome。这些是-forcedBrowserMode参数。否则,硒不会知道它应该对抗什么。您可能需要使用* iexploreProxy进行测试,有时它比* iexplore模式更好。

查看此链接以获取更多可能有用的参数:

http://seleniumforum.forumotion.net/t89-selenium-server-command-options-while-starting-server

答案 4 :(得分:0)

这种方式(附加网址)对我有用。

http://blog.varunin.com/2011/07/running-selenium-tests-on-different.html

以下几点与示例不同。

@Parameters
public static List data() {
    return Arrays.asList(new Object[][]{{"firefox"},{"ie"}});
}
@Before
public void setUp() throws Exception {
    System.out.println("browser: " + browser);
    if(browser.equalsIgnoreCase("ie")) {
        System.setProperty("webdriver.ie.driver", "IEDriverServer64.exe");
        driver = new InternetExplorerDriver();
    } else if(browser.equalsIgnoreCase("firefox")) {
        driver = new FirefoxDriver();

答案 5 :(得分:0)

您可以使用TestNG selenium + testng的组合为您提供了一个更好的结果 只需添加参数属性即可执行此操作

答案 6 :(得分:0)

您是否考虑过使用composite design pattern创建实际上运行多个组件WebDriver(例如chrome,gecko等)的CompositeWebDriver?为此,您可以使用一个新的类(例如CompositeWebDriver)扩展WebDriver类,该类将其调用委托给所有实际的WebDriver。

这也可以通过将RemoteWebDriver的各种实例作为组件来完成。