Да, вы можете расширить рамки действия. Но, строго говоря, получить что-то вроде:
browser.actions().mouseDown(element).sleep(5000).mouseUp(element).perform();
означает, баловаться с потрохами селена. Итак, YMMV.
Обратите внимание, что Protractor documentation ссылается на 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()
ожидает выполнения только 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...
функции, код селена использует с фондовым JavaScript.
копания в источники селена, насколько я понимаю, это не было бы возможным фактически расширить действия, я бы рассмотреть вопрос о создании своего рода обертке, как @John Стеннет предложил. Если вы заинтересованы, я могу дать объяснение, почему это невозможно сделать (с моей точки зрения, возможно, это возможно). –
@MichaelRadionov да, я боялся обертывания, это единственный вариант (в этом нет ничего плохого). Я был бы признателен за ваше понимание, ваши ответы всегда будут подробными и полезными. Кроме того, я надеюсь, что эта тема поможет не только мне решить мою текущую проблему, но и другим с похожими запросами. Благодаря! – alecxe