selenium js webdriver - 附加到活动会话

时间:2014-10-02 16:56:15

标签: javascript session selenium

我正在使用带有selenium-webdriver包的Node.js来运行我的测试 每次测试开始时,Web驱动程序都会启动一个新会话并打开一个新窗口 我正在尝试获取会话ID并稍后使用getSession()使用它 (doc referance link

var webdriver = require('selenium-webdriver');
var SeleniumServer = require('selenium-webdriver/remote').SeleniumServer;

var server = new SeleniumServer('./seleniumServer/selenium-server-standalone-2.43.1.jar', {
    port: 4444
});
server.start();

var driver = new webdriver.Builder()
        .usingServer(server.address())
        .withCapabilities(webdriver.Capabilities.firefox())
        .build();

console.log(driver.getSession());

但这会导致异常:

getSession();
^
TypeError: Object [object Object] has no method 'getSession'
    at Object.<anonymous> (\testing\demo_1.js:14:3)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

有谁能告诉我它有什么问题以及如何获得并设置selenium会话ID? 最重要的是,如何使用sessionId附加到打开的浏览器会话?

4 个答案:

答案 0 :(得分:5)

如果您的webdriver构建过程成功,driver应该有方法getSession()。可以找到getSession()的文档here

但是,getSession()返回的内容是一个承诺,因此您无法直接从返回值获取会话ID。你需要这样做:

 driver.getSession()
                .then( function(session){
                    var session_id = session.getId();
                });

您很可能需要将会话ID保存在文件中,然后在下次运行程序时,使用此函数附加到此会话ID:

browser = webdriver.WebDriver.attachToSession(...);

,可以找到哪些文档here

但是,问题是上面的函数调用attachToSession()没有通知您它是否成功。我解决它的方法是使用返回的WebDriver对象调用browser.getTitle(),并等待它解析/拒绝。我们将知道我们是否已成功附加到会话ID。

设置webdriver:

在回答用户3789620的问题时,我把设置webdriver的代码放在这里:

var webdriver_server = 'http://localhost:9515', // chromedriver.exe serves at this port 
chrome = require('selenium-webdriver/chrome'),
options = new chrome.Options(),
webdriver = require( 'selenium-webdriver'),
Http = require( 'selenium-webdriver/http');
options.setChromeBinaryPath(your_chrome_binary_path);

var browser = new webdriver.Builder()
  .withCapabilities(webdriver.Capabilities.chrome())
  .setChromeOptions(options)
  .usingServer(webdriver_server)
  .build()

if( 'undefined' != typeof saved_session_id && saved_session_id!= ""){
  console.log("Going to attach to existing session  of id: " + saved_session_id);
  client = new Http.HttpClient( webdriver_server );
  executor = new Http.Executor( client);
  browser = webdriver.WebDriver.attachToSession( executor, saved_session_id);
}

答案 1 :(得分:0)

您应该查看Cookie以保持您的会话。 webdriver.WebDriver.Options docs should help。实现此目的的一种方法是在退出会话之前将cookie保存到外部文件,并在每次开始测试时从此外部文件加载cookie。

答案 2 :(得分:0)

感谢gm2008,他的answer使我步入正轨。 attachToSession函数对我来说显示为undefined,可能是实现更改(我使用的是4.0.0-alpha.1的{​​{1}})。但是,我可以使用TypeScript中的以下命令完成所需的行为:

selenium-webdriver

只要保持会话打开并可以传递ID,就可以将其附加到现有的import wd, { WebDriver, Session } from 'selenium-webdriver' import { HttpClient, Executor } from 'selenium-webdriver/http' // My server URL comes from running selenium-standalone on my machine const server: string = 'http://localhost:4444/wd/hub' async function newBrowserSessionId(): Promise<string> { const browser: WebDriver = new wd.Builder() .withCapabilities(wd.Capabilities.chrome()) .usingServer(server) .build() const session: Session = await browser.getSession() return session.getId() } async function getExistingBrowser(sessionId: string): Promise<WebDriver> { const client: HttpClient = new HttpClient(server) const executor: Executor = new Executor(client) const session: Session = new Session(sessionId, wd.Capabilities.chrome()) return new WebDriver(session, executor) } async function driveExistingBrowser(browser: WebDriver): Promise<void> { await browser.get('https://www.google.com/') } async function closeExistingBrowser(browser: WebDriver): Promise<void> { await browser.close() } async function connectAndDrive(): Promise<void> { const sessionId: string = await newBrowserSessionId() const existingBrowser: WebDriver = await getExistingBrowser(sessionId) await driveExistingBrowser(existingBrowser) await closeExistingBrowser(existingBrowser) } connectAndDrive() 上,即使启动它的脚本已完成执行。每当您准备执行清理时,都可以使用Session函数。

答案 3 :(得分:-1)

尝试使用attachToSession(),如下所示:

webdriver.attachToSession(sessionId);

另请参阅the docs了解详情。