with javascriptexecutor how executescript javascript node.js selenium-webdriver

how - javascriptexecutor selenium python



Selenium WebDriver espera hasta que se muestre el elemento (8)

Escribir una función asincrónica para evitar este problema

(async function() { let url = args[0]; await driver.get(url); driver.quit(); })();

He buscado en Google y en el sitio SO y obtengo respuestas para JAVA, pero parece que no obtengo respuestas para node.js

Tengo una aplicación web que lleva tiempo cargar. Me gustaría seleccionar el programa para esperar hasta que se cargue la página y luego realizar algunas acciones.

Mi código actual es el siguiente

//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();

El error que obtengo es:

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)


Esto es lo único que me funciona:

const element = By.id(''element''); driver.wait(until.elementLocated(element)); const whatElement = driver.findElement(element); driver.wait(until.elementIsVisible(whatElement), 5000).click();


Intenta algo como esto:

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); } }); }

Lo adapté ligeramente en función de lo que encontré aquí: compruebe si existe el elemento: selenium / javascript / node-js y funcionó de maravilla.


Me topé con una respuesta a mi pregunta.

Entonces, para esperar a que aparezca un elemento, tenemos que:

driver.wait(function () { return driver.isElementPresent(webdriver.By.name("username")); }, timeout);



Puede registrar un oyente en webdriver.wait usando then()

return driver.wait(until.elementLocated(By.name(''username'')), 5 * 1000).then(el => { return el.sendKeys(username); });


Se me ocurrió este enfoque porque mantiene la sintaxis de promesa encadenable para que pueda escribir esto: await waitFind(By.id(''abc'')).click()

const waitFind = (locator) => { return driver.findElement(async () => { await driver.wait(until.elementLocated(locator)); return driver.findElement(locator); }); }


Usualmente uso esto:

var el = driver.wait(until.elementLocated(By.name(''username''))); el.click();