是的,您可以扩展操作框架。但是,严格来说,得到类似的东西:
browser.actions().mouseDown(element).sleep(5000).mouseUp(element).perform();
意味着搞乱 Selenium 的胆量。所以,YMMV。
注意,量角器文件指的是webdriver.WebDriver.prototype.actions
解释的行为,这是我采取意味着它不会修改或补充selenium什么时提供。
返回的对象类webdriver.WebDriver.prototype.actions
是webdriver.ActionSequence
。实际上使序列做任何事情的方法是webdriver.ActionSequence.prototype.perform
. 在默认实现中,此函数采用您调用.sendKeys()
或时记录的命令,并让关联.mouseDown()
的驱动程序ActionSequence
按顺序安排它们。所以添加一个.sleep
方法不能这样完成:
webdriver.ActionSequence.prototype.sleep = function (delay) {
var driver = this.driver_;
driver.sleep(delay);
return this;
};
否则,睡眠会发生的顺序进行。你要做的就是记录你想要的效果,以便稍后执行。
现在,要考虑的另一件事是默认值.perform()
只期望 execute webdriver.Command
,它们是要发送到浏览器的命令。睡觉不是这样的命令之一。所以.perform()
必须修改以处理我们将要记录的内容.sleep()
。在下面的代码中,我选择.sleep()
记录一个函数并修改.perform()
为处理除webdriver.Command
.
这是整个事情的样子,一旦放在一起。我首先给出了一个使用股票 Selenium 的例子,然后添加了补丁和一个使用修改后的代码的例子。
var webdriver = require('selenium-webdriver');
var By = webdriver.By;
var until = webdriver.until;
var chrome = require('selenium-webdriver/chrome');
// Do it using what Selenium inherently provides.
var browser = new chrome.Driver();
browser.get("http://www.google.com");
browser.findElement(By.name("q")).click();
browser.actions().sendKeys("foo").perform();
browser.sleep(2000);
browser.actions().sendKeys("bar").perform();
browser.sleep(2000);
// Do it with an extended ActionSequence.
webdriver.ActionSequence.prototype.sleep = function (delay) {
var driver = this.driver_;
// This just records the action in an array. this.schedule_ is part of
// the "stock" code.
this.schedule_("sleep", function () { driver.sleep(delay); });
return this;
};
webdriver.ActionSequence.prototype.perform = function () {
var actions = this.actions_.slice();
var driver = this.driver_;
return driver.controlFlow().execute(function() {
actions.forEach(function(action) {
var command = action.command;
// This is a new test to distinguish functions, which
// require handling one way and the usual commands which
// require a different handling.
if (typeof command === "function")
// This puts the command in its proper place within
// the control flow that was created above
// (driver.controlFlow()).
driver.flow_.execute(command);
else
driver.schedule(command, action.description);
});
}, 'ActionSequence.perform');
};
browser.get("http://www.google.com");
browser.findElement(By.name("q")).click();
browser.actions().sendKeys("foo")
.sleep(2000)
.sendKeys("bar")
.sleep(2000)
.perform();
browser.quit();
在我的实现中,.perform()
我已将goog...
Selenium 代码使用的函数替换为常用 JavaScript。