- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的是Selenium的新手。我设法使用下面的nodejs代码打开了一个网站
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder()
.forBrowser('chrome')
.build();
console.log(driver);
driver.get('https://web.whatsapp.com');
//perform all other operations here.
node test.js
运行脚本时,又需要2分钟来加载页面并执行所需的步骤。我只想重新打开已经打开的标签并继续执行脚本,而是打开新窗口。
var o = new chrome.Options();
o.addArguments("user-data-dir=/Users/vishnu/Library/Application Support/Google/Chrome/Profile 2");
o.addArguments("disable-infobars");
o.addArguments("--no-first-run");
var driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).setChromeOptions(o).build();
var savefile = fs.writeFile('data.json', JSON.stringify(util.inspect(driver)) , 'utf-8');
var parsedJSON = require('./data.json');
console.log(parsedJSON);
最佳答案
我花了一些时间和几种不同的方法,但是我设法完成了一些我认为可以解决您的问题并允许以相当不错的方式进行测试的工作。
因为它不能直接回答如何在Selenium中重用浏览器会话(使用它们的JavaScript API)的问题,所以我将首先介绍我提出的解决方案,然后简要讨论我尝试过的其他方法。它可能会给其他人一个想法,并帮助他们以更好/更好的方式解决此问题。谁知道。至少我的尝试会被记录在案。
拟议的解决方案(经测试可行)
因为我实际上没有设法重用浏览器会话(请参见下文),所以我认为我可以尝试其他方法。方法如下。
理念
在一个文件(例如init.js
)中有一个主循环,并在一个单独的文件(test.js
)中进行测试。
主循环打开浏览器实例并使其保持打开状态。它还公开了某种CLI,该CLI可以运行(来自test.js
的)测试,检查错误的发生并关闭浏览器实例并停止主循环。test.js
中的测试导出由主循环执行的测试功能。它通过了一个驱动程序实例来使用。主循环会捕获此处发生的任何错误。
由于浏览器实例仅打开一次,因此我们只需执行一次使用WhatsApp进行身份验证(扫描QR码)的手动过程。之后,运行测试将重新加载web.whatsapp.com,但它会记住我们已经过身份验证,因此可以立即运行在test.js
中定义的任何测试。
为了使主循环保持活动状态,至关重要的是我们必须捕捉到测试中可能发生的每个错误。不幸的是,为此我不得不求助于uncaughtException
。
实作
这是我提出的上述想法的实现。如果您愿意的话,可以将其做得更加出色。我在这里为了简单起见(希望我设法做到了)。
init.js
这是上述想法的主要循环。
var webdriver = require('selenium-webdriver'),
by = webdriver.By,
until = webdriver.until,
driver = null,
prompt = '> ',
testPath = 'test.js',
lastError = null;
function initDriver() {
return new Promise((resolve, reject) => {
// already opened a browser? done
if (driver !== null) {
resolve();
return;
}
// open a new browser, let user scan QR code
driver = new webdriver.Builder().forBrowser('chrome').build();
driver.get('https://web.whatsapp.com');
process.stdout.write("Please scan the QR code within 30 seconds...\n");
driver.wait(until.elementLocated(by.className('chat')), 30000)
.then(() => resolve())
.catch((timeout) => {
process.stdout.write("\b\bTimed out waiting for code to" +
" be scanned.\n");
driver.quit();
reject();
});
});
}
function recordError(err) {
process.stderr.write(err.name + ': ' + err.message + "\n");
lastError = err;
// let user know that test failed
process.stdout.write("Test failed!\n");
// indicate we are ready to read the next command
process.stdout.write(prompt);
}
process.stdout.write(prompt);
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
var chunk = process.stdin.read();
if (chunk === null) {
// happens on initialization, ignore
return;
}
// do various different things for different commands
var line = chunk.trim(),
cmds = line.split(/\s+/);
switch (cmds[0]) {
case 'error':
// print last error, when applicable
if (lastError !== null) {
console.log(lastError);
}
// indicate we are ready to read the next command
process.stdout.write(prompt);
break;
case 'run':
// open a browser if we didn't yet, execute tests
initDriver().then(() => {
// carefully load test code, report SyntaxError when applicable
var file = (cmds.length === 1 ? testPath : cmds[1] + '.js');
try {
var test = require('./' + file);
} catch (err) {
recordError(err);
return;
} finally {
// force node to read the test code again when we
// require it in the future
delete require.cache[__dirname + '/' + file];
}
// carefully execute tests, report errors when applicable
test.execute(driver, by, until)
.then(() => {
// indicate we are ready to read the next command
process.stdout.write(prompt);
})
.catch(recordError);
}).catch(() => process.stdin.destroy());
break;
case 'quit':
// close browser if it was opened and stop this process
if (driver !== null) {
driver.quit();
}
process.stdin.destroy();
return;
}
});
// some errors somehow still escape all catches we have...
process.on('uncaughtException', recordError);
var driver, by, until,
timeout = 5000;
function waitAndClickElement(selector, index = 0) {
driver.wait(until.elementLocated(by.css(selector)), timeout)
.then(() => {
driver.findElements(by.css(selector)).then((els) => {
var element = els[index];
driver.wait(until.elementIsVisible(element), timeout);
element.click();
});
});
}
exports.execute = function(d, b, u) {
// make globally accessible for ease of use
driver = d;
by = b;
until = u;
// actual test as a promise
return new Promise((resolve, reject) => {
// open site
driver.get('https://web.whatsapp.com');
// make sure it loads fine
driver.wait(until.elementLocated(by.className('chat')), timeout);
driver.wait(until.elementIsVisible(
driver.findElement(by.className('chat'))), timeout);
// open menu
waitAndClickElement('.icon.icon-menu');
// click profile link
waitAndClickElement('.menu-shortcut', 1);
// give profile time to animate
// this prevents an error from occurring when we try to click the close
// button while it is still being animated (workaround/hack!)
driver.sleep(500);
// close profile
waitAndClickElement('.btn-close-drawer');
driver.sleep(500); // same for hiding profile
// click some chat
waitAndClickElement('.chat', 3);
// let main script know we are done successfully
// we do so after all other webdriver promise have resolved by creating
// another webdriver promise and hooking into its resolve
driver.wait(until.elementLocated(by.className('chat')), timeout)
.then(() => resolve());
});
};
run test
将打开一个Chrome实例。其他调用将使用相同的实例。当发生错误时,可以如图所示对其进行检查。执行
quit
将关闭浏览器实例并退出主循环。
$ node init.js
> run test
> run test
WebDriverError: unknown error: Element <div class="chat">...</div> is not clickable at point (163, 432). Other element would receive the click: <div dir="auto" contenteditable="false" class="input input-text">...</div>
(Session info: chrome=57.0.2987.133)
(Driver info: chromedriver=2.29.461571 (8a88bbe0775e2a23afda0ceaf2ef7ee74e822cc5),platform=Linux 4.9.0-2-amd64 x86_64)
Test failed!
> error
<prints complete stacktrace>
> run test
> quit
test-foo.js
,然后在上述提示中执行
run test-foo
以运行它。所有测试将共享同一个Chrome实例。
localStorage
。可以将
export作为JSON并
write生成文件。在下一次调用时,此文件可以是
read,
parsed,并在重新加载页面之前将其写入新的浏览器实例存储中。
sessionStorage
,...),但没有解决。经过一段时间后,WhatsApp可能会将浏览器注册为已断开连接。还是它使用其他浏览器属性(会话ID?)来识别浏览器。从我的角度来看,这纯粹是猜测。
关于javascript - 再次使用同一实例webdriverJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43353279/
使用 selenium 和 webdriverJS 我想创建一个测试来检查页面上是否未显示某个元素。为了检查一个或多个元素是否存在,我决定使用 isDisplayed() 函数: driver.fin
我正在使用 webdriverjs 打开一个网站并通过其 id 选择一个元素。代码是, var webdriverjs = require('webdriverjs'), client
Protractor 在底层使用 WebDriverJS。 WebDriverJS 使用“控制流”的概念来确保异步任务以预期的确定顺序执行。 因此以下将按预期工作: myElement.click()
我知道有以下资源: http://docs.seleniumhq.org/docs/03_webdriver.jsp https://code.google.com/p/selenium/wiki/W
检查页面中是否存在元素时出现问题 例子 return driver.wait(function() { driver.findElement(By.css(".clas
我有 Java+WebDriver 背景,并且是 Protractor 、WebdriverJS 和 Jasmine 的新手。在显示的图像中,我试图将鼠标悬停在所有气泡上并获取工具提示值(城市、已售出
我正在尝试弄清楚 WebDriverJs 中的循环如何与 promises 一起工作。 假设您有以下 html: Rock Paper Scissors 我想使用
我正在尝试使用 Selenium、WebDriverJS 和 Jasmine 创建一个测试,以验证无论何时 li元素通过拖放 选择向右移动,不应再显示。这是我的代码片段: it('should mak
这里有人有使用 Selenium 和 webdriverjs 的经验吗?我来自非 Java 背景,总体上具有丰富的 Node.js 和 JavaScript 经验。根据 Selenium 文档,您必须
我正在尝试从 React.js 网络应用程序中点击一个动态加载的项目。该项目打开一个模式窗口,类名称为 newItemView。我试过很多东西,但没有什么是可靠的。它会工作几次,但随后给我一个错误。
我在 Alister Scott's 中找到了博客如何等到元素更改为特定值。但是我无法解决如何创建等待元素等待直到其文本从特定值(在我的例子中是“-”)更改为其他任何东西(在我的例子中它是一个计数器,
好吧,这越来越烦人了。我已经尝试解决这个问题四天了,但我被困住了。我需要单击一个按钮,但该按钮没有 ID 或类属性。我认为唯一的方法是循环遍历所有“Button”对象并找到包含文本“Submit”的对
所以我让驱动程序打开 Chrome 到网页,然后让它单击打开第二个窗口的按钮。 driver.get("https://web.com"); driver.findElement(webdriver.
使用用于 javascript 的 selenium-webdriver 等待页面完全加载的最佳方法是什么?我注意到 this question非常相似,但我需要在 javascript 中实现。 v
我有一个下拉框,我想使用 WebDriverJS 选择一个值。我查看了下面的用户指南,但找不到如何操作 https://code.google.com/p/selenium/wiki/WebDrive
好吧,我想我已经完成了这里的作业...我这辈子都无法得到 official Selenium Webdriver npm module上类;我卡住了。这是我对所有内容的版本... Ubuntu 14.
我正在尝试使用 webdriverjs单击 Flash 动画。 我尝试使用高级用户交互,但我似乎无法点击我想要的地方。甚至当我试图点击一个普通的网络元素时,比如一个按钮。 最理想的情况是,我想执行以下
有人知道如何等待 WebElement 在 WebDriverJS 中可点击吗? ?我已经知道如何等待元素“可见”,但我需要它是“可点击的”。类似于 expectable conditions 的东西
我正在使用 WebDriverJS ,用于 WebDriver 的 JavaScript 绑定(bind),用于做一些简单的前端测试(由 nodejs 驱动)。但是,我在调整窗口大小时遇到了困难,
我已经开始学习 WebDriverJs 来测试使用 Javascript 作为脚本语言的网站,网址为 https://code.google.com/p/selenium/wiki/WebDriver
我是一名优秀的程序员,十分优秀!