selenium-js-webdriver-附加到活动会话
selenium js webdriver - attach to active session
我使用Node.js和selenium-webdriver
包来运行我的测试
每次测试开始时,web驱动程序都会启动一个新会话并打开一个新窗口
我正在尝试获取会话Id,稍后使用getSession()
使用它(文档参考链接)
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
有人能告诉我它出了什么问题,以及我是如何获取和设置硒会话id的吗
最重要的是,如何使用sessionId
连接到打开的浏览器会话?
如果您的Web驱动程序构建过程成功,则driver
应具有方法getSession()
。getSession()的文档可以在这里找到。
但是,getSession()
返回的是一个promise,因此您不会直接从返回值中获得会话id。你需要这样做:
driver.getSession()
.then( function(session){
var session_id = session.getId();
});
很可能您需要将会话id保存在一个文件中,然后在下次运行程序时,使用以下函数附加到此会话id:
browser = webdriver.WebDriver.attachToSession(...);
,其中的文档可在此处找到。
但是,问题是上述函数调用attachToSession()
不会通知您是否成功。我处理它的方法是使用返回的WebDriver对象调用browser.getTitle()
,并等待它解析/拒绝。我们将知道我们是否已成功连接到会话id。
设置网络驱动程序:
在回答用户3789620的问题时,我将设置网络驱动程序的代码放在这里:
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);
}
感谢gm2008,他的回答让我走上了正轨。对我来说,attachToSession
函数显示为undefined
,这可能是一个实现更改(我使用的是selenium-webdriver
的4.0.0-alpha.1
)。然而,我能够用TypeScript中的以下内容完成所需的行为:
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()
只要您保持会话打开并有办法传递ID,即使在启动它的脚本完成执行后,您也可以附加到现有的Session
。closeExistingBrowser()
函数可以在准备执行清理时使用。
您应该查看cookie以保持会话。网络驱动程序。WebDriver.Options文档应该会有所帮助。实现这一点的一种方法是在退出会话之前将cookie保存到一个外部文件,并在每次开始测试时从该外部文件加载cookie。
试着像这样使用attachToSession()
:
webdriver.attachToSession(sessionId);
有关更多信息,请参阅文档。
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 活动选项卡's源代码-获取变量s值
- 在Angular 2中布线期间保持零部件处于活动状态
- 在ajax成功后,cluetip不适用于首次点击活动元素
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 如何在没有JQuery的情况下,通过对服务器的基本ajax调用,根据浏览器上的用户活动保持服务器会话活动
- Facebook API - 检测会话是否处于活动状态
- 如何在角度 JS 中保持会话活动
- 节点.js后请求 - 保持会话活动
- 在数据库数据更改时向所有活动会话发送响应
- 无法在量角器测试中保持用户会话活动状态
- 未在活动服务器中传递会话变量
- selenium-js-webdriver-附加到活动会话
- Express4.js -路由只有当有一个活动的passport.js会话
- 当用户处于非活动状态时,如何结束会话?
- 使用jQuery为长时间运行的过程保持会话活动
- 如果用户仍然在Joomla的客户端javascript应用程序上活动,我如何扩展Joomla会话
- 我如何保持一个登录会话活动从我的独立iOS web应用程序
- 是否有可能在用户的活动会话中跟踪互联网断开?