我可以使用selenium-webdriver一次(同时)运行多个实例吗?

时间:2015-11-16 18:13:02

标签: javascript selenium selenium-webdriver

我正在尝试使用Selenium自动执行文件上传。

我已经用selenium-webdriver写了一个很小的程序。

问题是,需要上传数千个文件,我想同时运行多个浏览器实例以加快自动化。所以我试过这样的事情

# For testing, I'm simply reading in a single image instead of a video frame

frame = cv2.imread('Koala.jpg',0)     # this is a numpy.ndarray object
height, width = frame.shape         
my_image = QImage(frame.tostring(), width, height, QImage.Format_RGB888)

# By here, things seem okay. print(mimage) basically says <QImage object at 0x32243>

# my_image.rgbSwapped()               # This line crashes program
pixmap = QPixmap.fromImage(mimage)    # This line crashes program as well

我预计这会同时创建10个浏览器实例,并同时进行自动化。

但实际上......上面的代码将逐个创建浏览器实例,这意味着,在上一个实例完成之前,它不会创建另一个实例。

我也尝试在多个shell实例中执行该程序,这将为我启动多个浏览器实例,但我只是不想这样做...

4 个答案:

答案 0 :(得分:4)

你需要创建多个线程而不是循环,然后你可以在并行线程中开始每个上传。你走在正确的轨道上。你不需要selenium grid来实现这一点。

查找多线程。您可以从此answer

开始

你需要网格来执行多个浏览器会话是不对的。您可以通过创建多个驱动程序对象并管理它们来调用多个浏览器会话。如果您愿意,每个会话都将是独立的。

网格用于扩展,因为您可以运行的浏览器实例数量有限制,可以保持机器性能不变并且测试稳定。就像在一台机器中超过5个chrome实例一样。如果你想做更多的事情,那么你必须使用selenium Grid。

答案 1 :(得分:0)

这正是Selenium Grid的目的。

答案 2 :(得分:0)

您应该为要打开的每个新浏览器创建一个新的WebDriver实例及其功能。

以下内容将在五个独立的Chrome实例中打开Goog​​le。

import * as webdriver from "selenium-webdriver";
import * as Chrome from 'selenium-webdriver/chrome';

function loadSelenium(){
    let options = new Chrome.Options();
    let capabilities = options.toCapabilities();
    console.log('loading another');
    return new webdriver.Builder()
        .forBrowser('chrome')
        .withCapabilities(capabilities)
        .build();
}

for(let i = 0; i < 5; i++) {
    let driver = loadSelenium();
    driver.get('http://www.google.com');
}

答案 3 :(得分:0)

parallel =“ methods”:TestNG将在单独的线程中运行所有测试方法。依赖方法也将在单独的线程中运行,但是它们将遵循您指定的顺序。

parallel =“ tests”:TestNG将在同一线程中的同一标签中运行所有方法,但是每个标签将在单独的线程中。这样,您就可以将所有不是线程安全的类归为同一类,并确保它们都将在同一线程中运行,同时利用TestNG使用尽可能多的线程来运行测试。

parallel =“ classes”:TestNG将在同一线程中运行同一类中的所有方法,但是每个类将在单独的线程中运行。

parallel =“ instances”:TestNG将在同一线程中的同一实例中运行所有方法,但是在两个不同实例中的两个方法将在不同线程中运行。