Selenium:重用现有的浏览器会话,而不是打开新窗口?

软件测试 自动化测试 硒2 浏览器自动化
2022-01-23 13:55:27

这已经在网上被问了一百万次,但没有明确的答案。我今天尝试了“-browserSessionReuse”,没有任何运气;我的测试不断产生新的浏览器窗口。

X:\QA\Automation\SELENIUM_SERVER>java -jar selenium-server-standalone-2.8.0.jar -log "log.txt" -browserSessionReuse -forcedBrowserMode "*googlechrome"
<snip>
13:42:25.923 INFO - Will recycle browser sessions when possible.

也许这就是我在 .py 文件中启动 Selenium 的方式?

sel = selenium('localhost', 4444, "*chrome", 'http://server/')
sel.start()

...也许我正在做太多的服务器启动?

4个回答

这可以通过 Selenium 2 和 WebDriver 实现。我不确定它是否具有不同的版本。在带有 WebDriver 的 Selenium 2 中,您可以调用webDriver = new FirefoxDriver()which 生成浏览器,并且该浏览器将在您的测试期间保持打开状态,或者您可以选择使用webDriver.Quit().
我喜欢在测试之间关闭我的浏览器窗口,这样我就知道我的测试不会因为存储的会话数据而“脏”,这可能会影响测试的运行方式,但我可以在一些有针对性的测试中看到价值,我想尝试几个不同的场景,同时保持相同的会话进行。

我过去通过将我的 Selenium 驱动程序实例声明为由整个测试套件加载的静态成员来做到这一点。然后,将该成员作为参数传递给每个测试。然后,我还创建了一些方法来跟踪打开了多少窗口并确保最后一个窗口永远不会关闭。然后,在每次测试后,我关闭除最后一个窗口之外的所有窗口,并将最后一个窗口重定向到“about:blank”。然后,当我的测试运行时,它会重用窗口。

从那以后,我放弃了这种方法,因为我不再需要它,原因如下:

  1. 使用静态全局 webdriver 对象是不好的编程习惯。我的驱动程序是由所有测试扩展的实用程序类的一部分,因此我的测试类不能扩展任何其他类。您可以使用 Scala 和/或 JDK1.8 来解决这个问题,因为它们具有“防御者方法”接口功能,但由于我使用的是 JDK1.7,因此我需要以正确的方式进行操作。
  2. 现在我在每次测试后关闭浏览器,但由于我现在使用“Selenium Grid”,我不再需要担心重新打开浏览器对性能的影响,因为我可以在问题上投入更多硬件并运行多线程。

注意:这是我现在如何做事的示例,但请记住,现在有更好的方法可以做到这一点。

这在webdriver.io中对我有用

var webdriverio = require('webdriverjs-angular');
var options = {
    desiredCapabilities: {
        browserName: 'firefox'
    },
    ngRoot: 'html' // main application selector
};

var wd = webdriverio.remote(options).init();

var wd2 = webdriverio.remote(options);
wd2.requestHandler.sessionID=wd.requestHandler.sessionID;
wd2.url('http://www.seamless.com');

我使用 TestNG 遇到了同样的问题。我曾经使用过@BeforeMethod,并且每种方法都会打开新的浏览器。

当我将其更改为@BeforeTest而不是 时@BeforeMethod,这对我有用。