Ответ 1
Я наткнулся на ответ на мой вопрос
Итак, чтобы ждать появления элемента, мы должны:
driver.wait(function () {
return driver.isElementPresent(webdriver.By.name("username"));
}, timeout);
Я искал в Google и на SO-сайте, и я получаю ответы на JAVA, но, похоже, не получил ответов на node.js
У меня есть веб-приложение, которое требует времени для загрузки. Я бы селенную программу, чтобы дождаться загрузки страницы, а затем выполните некоторые действия.
Мой текущий код выглядит следующим образом
//dependencies
var webdriver = require('selenium-webdriver'),
util = require('util'),
_ = require('underscore');
var driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build();
var branchName = _.isUndefined(process.argv[3]) ? 'branch' : process.argv[3],
hostName = _.isUndefined(process.argv[2]) ? 'localhost' : process.argv[2],
appTmpl = 'http://%s/%s',
username = 'xxxx',
password = 'xxxx';
var appUrl = util.format(appTmpl, hostName, branchName);
driver.get(appUrl);
driver.findElement(webdriver.By.name("username")).sendKeys(username);
driver.findElement(webdriver.By.name("password")).sendKeys(password);
driver.findElement(webdriver.By.name("login_button")).click();
driver.quit();
Ошибка, которую я получаю:
C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:1643
throw error;
^
NoSuchElementError: no such element
(Session info: chrome=37.0.2062.103)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.1 SP1 x86_64)
at new bot.Error (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\atoms\error.js:109:18)
at Object.bot.response.checkResponse (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\atoms\response.js:106:9)
at C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:277:20
at C:\Work\study\selenium\node_modules\selenium-webdriver\lib\goog\base.js:1243:15
at webdriver.promise.ControlFlow.runInNewFrame_ (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:1539:20)
at notify (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:362:12)
at notifyAll (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:331:7)
at resolve (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:309:7)
at fulfill (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:429:5)
at C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:1406:10
==== async task ====
WebDriver.findElement(By.name("username"))
at webdriver.WebDriver.schedule (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:268:15)
at webdriver.WebDriver.findElement (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:711:17)
at Object.<anonymous> (C:\Work\study\selenium\test.js:15:8)
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)
Я наткнулся на ответ на мой вопрос
Итак, чтобы ждать появления элемента, мы должны:
driver.wait(function () {
return driver.isElementPresent(webdriver.By.name("username"));
}, timeout);
Вы можете зарегистрировать прослушиватель на webdriver.wait
с помощью then()
return driver.wait(until.elementLocated(By.name('username')), 5 * 1000).then(el => {
return el.sendKeys(username);
});
Попробуйте что-то вроде этого:
function isItThere(driver, element){
driver.findElement(webdriver.By.id(element)).then(function(webElement) {
console.log(element + ' exists');
}, function(err) {
if (err.state && err.state === 'no such element') {
console.log(element + ' not found');
} else {
webdriver.promise.rejected(err);
}
});
}
Я немного адаптировал его в зависимости от того, что я нашел здесь: Проверьте, существует ли элемент - selenium/javascript/ node -js, и это сработало.
Вам не нужна специальная функция, вы можете просто сделать это:
let el = driver.findElement(By.id(`import-file-acqId:${acqId}`));
driver.wait(until.elementIsVisible(el),100);
return el.sendKeys(file);
Смотрите документы здесь:
https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/until.html
Это единственное, что работает для меня:
const element = By.id('element');
driver.wait(until.elementLocated(element));
const whatElement = driver.findElement(element);
driver.wait(until.elementIsVisible(whatElement), 5000).click();
Запись асинхронной функции, чтобы избежать этой проблемы
(async function() {
let url = args[0];
await driver.get(url);
driver.quit();
})();