在网络上已经被问了一百万遍了,但是没有明确的答案。我今天尝试“ -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()


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

评论

我认为那是不可能的。 afaik Selenium始终使用新的窗口

我得到了相同的结果,我想一次重用以在站点测试中检查cookie值。

您可以检查QMetry自动化框架,该框架允许您最大程度地重用会话。您不需要创建或完全由框架来管理驱动程序,这取决于您的运行配置。

#1 楼

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

评论


有趣的是,我今天早上只是在阅读有关内容,我认为它将解决我的浏览器Windows问题。谢谢。

–亚伦剃须刀
2011年10月19日在18:19

如果已经在(chrome)浏览器中打开了一个页面(例如google),并且我想单击带有硒脚本的按钮怎么办?在(旧的)UFT / QTP中,这是如此容易。

– MasterJoe
18年6月6日在2:40

#2 楼

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

从那以后,我不再使用此方法,因为不再需要它,原因如下:


使用静态全局webdriver对象是不好的编程习惯。我的驱动程序是所有测试扩展的实用程序类的一部分,因此,我的测试类无法扩展任何其他类。您可以使用Scala和/或JDK1.8来解决这个问题,因为它们具有“防御者方法”
接口功能,但是由于我使用的是JDK1.7,因此我需要这样做>正确的方法。
现在我在每次测试后都关闭浏览器,但是由于我现在使用的是“ Selenium

#3 楼

这适用于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');


#4 楼

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

评论


如果您通过测试方法参数传入驱动程序实例(从DataProvider中传入),则要使用BeforeMethod,但是如果您在类中具有用于多个测试方法的共享驱动程序(我认为这是一个坏主意),那么您想要当然,请使用BeforeTest。

– djangofan
16年1月1日,在2:20

#5 楼

您可以通过在多个测试中使用相同的硒实例来实现。这需要一些控制硒启动和停止的代码设计。我们正在使用ISFW,它提供了一种使用Java的方式,因此可以肯定的是,在python中也可以做一些努力。

#6 楼

我已经将我的代码实现为新的webdriver代码,如下所示,请参见以下页面:https://github.com/becausetesting/commons/blob/master/src/main/java/com/github/becausetesting/cucumber/selenium/ RemoteWebDriverEx.java:
只需使用以下代码即可使用现有的已启动硒会话:
WebDriver driver=new RemoteWebDriverEx(true);


评论


嗨,Alter!我不明白那个构造函数的作用。我查看了您链接的类,发现它设置了变量,但该变量似乎从未被使用过!这是如何运作的?

–corsiKa♦
16年6月22日在17:43

@corsiKa您在这里提到的哪个变量,在这里我覆盖了RemoteWebDriver类,并传递了一个单独的新参数来表明您是否要使用现有的硒会话。如果设置为true,它将在远程Web驱动程序服务器中找到任何现有会话。请让我知道您的问题是什么?谢谢 。

–胡锦涛
16年6月23日在4:29

您的WebDriver驱动程序片段= new RemoteWebDriverEx(true); -在GitHub链接中,构造函数中的true变量在类内设置为私有变量。但是该私有变量未在类中的任何地方使用。那么...它到底是做什么的?

–corsiKa♦
16年6月23日在15:04

是的@corsiKa,很抱歉稍后给我答复,我已将代码更新为新工具,感谢您的审查。 /…

–胡锦涛
16年7月1日在4:50

#7 楼


当我遇到这个问题时,我正在写我的自动答案,我希望它可以控制一个已经存在的浏览器来完成准备工作,例如登录的准备工作花费很长时间然后再登录像硒一样失败,我国一些大公司的基地。我在网上搜索信息,包含此页面,但找不到作品。我必须自己解决这个问题,最后我找到了解决办法。后。我们将信息设置为第二个程序。

关键是第二个程序,
第二个程序需要使用RemoteWebDriver类。因为第一个程序使用Web服务器的浏览器打开了,但官方api尚未提供该api,请重新打开现有的浏览器。在阅读源代码之后,我决定覆盖RemoteWebDriver,因为在扩展的RemoteWebDriver上,我无法修改功能字段,因此我将其覆盖,但是另一种使用反射的方法可以尝试一下,该类newInstance主要工作是startClient和startSession中,startClient方法保持良好,我们需要更改startSession方法,修改嵌套的execute Command并添加带有cookie-string的Construct方法。

RemoteWebDriver太长。文本区域有字母限制,下面是链接
https://github.com/chekn/source-ex-ref/blob/master/RemoteWebDriver.java


您可以像这样使用

1. Get the RemoteWebDriver class from upper link, instand the official

2. Open a browser

    FirefoxDriver driver = new FirefoxDriver();

    LazyCommandExecutor ce = (LazyCommandExecutor) driver.getCommandExecutor();
    String svr= ce.getAddressOfRemoteServer().toString();
    System.out.println( "svr: " + svr);

    String sid = driver.getSessionId().toString();
    System.out.println("sid: " + sid );
    TimeUnit.MINUTES.sleep(10L);

Important Tips:<br>
Please terminate program of this step launch in 10s (depend the TimeUnit sleep setter value), i find when i let it run finish, the third step execute command will fail that appear no reponse exception. i donot know Why, i think maybe program finished normal, the thread send the other order block the server api, only for the right request(right url and right params), if use wrong request it reponse, how Odd! I donot like go back view. So if you know the reason and you have different discovery, welcome back tell me.

3.Reuse the browser, use the up step printed host and cookie

    DesiredCapabilities capabilities = DesiredCapabilities.firefox();
    RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:7055/hub"), "41ad3bed-53af-4fdf-a2d1-f3f428e7d071", capabilities);


现在可以使用浏览器了。