Tak, można rozszerzyć ramy powództw. Ale, ściśle mówiąc, dostając coś takiego:
browser.actions().mouseDown(element).sleep(5000).mouseUp(element).perform();
oznacza brudząc z wnętrzności selen jest. Więc, YMMV.
Należy pamiętać, że Protractor documentation odnosi się do webdriver.WebDriver.prototype.actions
podczas objaśniania czynności, które uważam za znaczące, że nie modyfikuje ani nie dodaje do tego, co zapewnia Selenium.
Klasa obiektu zwrócona przez webdriver.WebDriver.prototype.actions
to webdriver.ActionSequence
. Metoda, która faktycznie powoduje wykonanie sekwencji, to webdriver.ActionSequence.prototype.perform
. W domyślnej implementacji ta funkcja pobiera komendy, które zostały zarejestrowane, gdy wywołano .sendKeys()
lub .mouseDown()
i ma sterownik, z którym skojarzony jest ActionSequence
, zaplanuj je w odpowiedniej kolejności. Więc dodanie .sleep
metodę nie można tego zrobić w ten sposób:
webdriver.ActionSequence.prototype.sleep = function (delay) {
var driver = this.driver_;
driver.sleep(delay);
return this;
};
przeciwnym razie sen się stanie poza kolejnością. To, co musisz zrobić, to efekt, który chcesz, aby został wykonany później.
Inną rzeczą do rozważenia jest to, że domyślnie .perform()
oczekuje tylko wykonania webdriver.Command
, które są poleceniami do wysłania do przeglądarki. Spanie nie jest jednym z takich poleceń. Tak więc .perform()
musi zostać zmodyfikowany, aby obsłużyć to, co zamierzamy nagrać z .sleep()
. W poniższym kodzie ustawiłem opcję .sleep()
nagrywania funkcji i modyfikacji .perform()
do obsługi funkcji oprócz webdriver.Command
.
Oto, jak wygląda całość po złożeniu. Najpierw podałem przykład użycia selenu zapasów, a następnie dodałem łatki i przykład używając zmodyfikowanego kodu.
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();
W moim realizacji .perform()
Mam zastąpił goog...
funkcje Kod selen korzysta z stanie JavaScript.
wbijały źródło selenu o ile rozumiem, to nie byłoby możliwe, aby faktycznie rozszerzyć działania, chciałbym rozważyć utworzenie pewnego rodzaju opakowaniu jednostkowym jak @John Stennett zasugerował. Jeśli jesteś zainteresowany, mogę podać wyjaśnienie, dlaczego nie można tego zrobić (z mojego punktu widzenia, być może jest to możliwe). –
@ Michael Radionov tak, bałem się, że zawijanie jest jedyną opcją (nie ma w tym nic złego). Byłbym wdzięczny za twój wgląd, twoje odpowiedzi są zawsze szczegółowe i pomocne. Poza tym mam nadzieję, że ten temat pomógłby mi nie tylko rozwiązać mój obecny problem, ale także innych, którzy mają podobne żądania. Dzięki! – alecxe