0

我希望能够获取一个字符串列表,将列表分成几部分,并让每个浏览器运行搜索列表的一部分(即 browser1 执行 1/5,browser2 执行 2/5 ......),比如说 Google (我碰巧使用的是 Firefox)。

我将如何使用 Selenium Grid 执行此操作。我已经设置好了,我知道如何将集线器和节点注册到该集线器,但如果它有助于您的解释或解决方案涉及不同类型的实例化,请告诉我。我认为这将有助于其他阅读本文的用户将其投入...

不过,一步一步的解决方案会让我满意。即使有 2 个节点,我也无法让 Selenium 同时运行浏览器。是否需要我使用 TestNG 或 Mable 或其他东西(我不熟悉这些)?我希望有一天能把这个程序开发成一个 Win32 应用程序(C++/C#),所以如果我以后不能封装它以进行分发,它就不能只在“测试套件”中运行。

编辑: 这是我的意思的框架。显然它不会完成任务,因为我现在正在问这个问题。我不知道这是否需要多个驱动程序甚至同一程序的多个副本在内存中运行,所以我将在代码中适当地注释。这绝不是并发的——只是我希望在网格上并发的任务。

public void beginSearch(){

    ArrayList<String> searchTerms=new ArrayList<String>();
    //Pretend searchTerms is full of 100 Strings!

    //Create a new instance of the Firefox Driver
    capabilities=DesiredCapabilities.firefox();

    //Let's say I have one WebDriver object for now 
    try{
        driver=new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
    }catch (MalformedURLException e){
        e.printStackTrace();
    }

    //Go to Google
    driver.get("http://www.google.com");

    for(int i=0; i<searchTerms.size(); i++){

         /*I put the findElement() inside the loop due to experience with it
          *not being able to interact with the same element on a different page when
          *the URL changes. I think it's due to XPath use internally in the WebElement
          *class. Ignore this for now.
          */
         element=driver.findElement(By.name("q"));
         element.sendKeys(searchTerms.get(i));
         element.submit();
    }

    driver.quit;
}
/*Let's say for the hell of it this is all I wanted to do-how could I make it perform
 *this concurrently on the Grid!?
 */
4

2 回答 2

4

有趣...据我所知,就您使用的实际代码而言,在代码中连接到 WebDriver 与直接连接到 WebDriver 没有什么不同。您可以以与连接到网格相同的方式连接到单个节点。网格仅负责确定将测试移交给哪个节点,并在没有任何可用节点时对请求进行排队。只要您不共享引用,您应该能够在单个线程上使用 WebDriver 连接 Selenium Grid2 而不会出现任何问题。我认为一般规则是每个线程一个 WebDriver。

https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions

你绝对不需要像 TestNG 这样的东西。TestNG 包含许多不错的功能,例如提供大型数据集的方法、高级日志记录功能、测试套件等。

http://en.wikipedia.org/wiki/TestNG

这是一个非常基本的想法。每个测试都在它自己的线程上运行,WebDriver 的每个实例都在它自己的线程上运行。我没有测试过这段代码。

public class Tests {
    public static void main(String[] args) {
        for(int threadCount = 0; threadCount<5; threadCount++) {
            new Thread(new Runnable() {
                public void run() {
                    //Create a new instance of the Firefox Driver
                    capabilities=DesiredCapabilities.firefox();

                    //Let's say I have one WebDriver object for now 
                    try{
                        driver=new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
                    }catch (MalformedURLException e){
                        e.printStackTrace();
                    }

                    //Go to Google
                    driver.get("http://www.google.com");

                    //Quit Driver
                    driver.quit;
                }
            }).start();
        }
    }
}
于 2013-05-05T19:19:34.667 回答
2

我不建议尝试以这种方式管理您的线程,但尝试这样做可能会发现问题:

WebDriver driver = ThreadGuard.protect( 
      new RemoteWebDriver( "http://localhost:4444/wd/hub", capabilities) );

我使用 TestNG 来管理我的线程,所以我不需要太担心这些东西。

于 2013-10-18T05:14:59.103 回答