使用Selenium Web Driver在多个浏览器上运行测试

5
我正在尝试通过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个回答

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/其他编程语言进行测试,我还强烈建议使用页面对象

祝你好运!


谢谢,我会以类似的方式尝试并向您汇报进展情况。 :-) - Prakash
嘿,你试过运行同一浏览器的多个实例吗?我正在尝试用Chrome,但它失败了,但我的构造函数从new ChromeDriver() 开始。你认为有办法做到这一点吗? - Johnydep

1

所以如果我理解正确,您有一个测试用例,并希望对其进行不同浏览器的测试。

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

这个想法是能够在特定浏览器上独立运行每个测试用例(这是JUnit的哲学),而不是按顺序运行所有测试用例以达到特定浏览器。

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

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

例如:FirefoxTestOne.java,IeTestOne.java,ChromeTestOne.java。

请注意,您可以在FirefoxTestOne中添加多个Firefox测试,没有问题。但是不能保证它们将按特定顺序执行(JUnit的哲学)。

有关链接和教程,请向谷歌搜索。已经有很多示例编写了。


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();

0

你是否考虑过使用组合设计模式来创建一个CompositeWebDriver,它实际上运行多个组件WebDriver(如chrome、gecko等)?为此,您可以通过新建一个扩展了WebDriver类的类(例如CompositeWebDriver),并将其调用委托给所有实际的WebDrivers。

这也可以使用各种RemoteWebDriver实例作为组件来完成。


0
你可以使用TestNG来完成这个任务,结合Selenium和TestNG可以获得更好的结果,只需添加参数属性即可实现。

0

您需要使用所选浏览器生成多个测试类(或Webdriver实例)。

一个Webdriver定义了一个浏览器。


这就是我在for循环内部尝试做的事情。在browser.get()之后,我有browser.close()函数。因此,当for循环开始下一次迭代时,它应该使用特定于新bro变量的驱动程序对象创建一个新的驱动程序对象。 - Prakash

0

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

Internet Explorer的参数是*iexplore,Firefox的参数是*firefox,Chrome的参数是*chrome。这些都是-forcedBrowserMode参数。否则,selenium将不知道它应该运行什么。您可能需要在测试中使用*iexploreProxy,有时它比*iexplore模式更好用。

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

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


谢谢您的回复。在文档中并没有提到对于每种新的浏览器类型我们需要单独使用一个服务器实例;我已经使用了单个Selenium服务器实例并使用它来访问IE、FF、Chrome和Safari,使用的是Selenium RC。而且 *iexplore/*firefox 的参数模型是为 Selenium RC 设计的,不是吗?我正在尝试使用Selenium 2.0 (Webdriver)创建测试用例。如果有任何可以帮助我的文档,请指出来,谢谢。 - Prakash
截至2.6版本,它仍然与Webdriver兼容(我有一段时间没有更新了)。 - TheDawg
如果您将Selenium作为主机和节点运行,则可以为您想要的所有浏览器(或可以适合同一台机器上的浏览器)提供配置文件。 - Mark Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接