Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Selenium WebDriver等待元素显示_Javascript_Node.js_Selenium Webdriver - Fatal编程技术网

Javascript Selenium WebDriver等待元素显示

Javascript Selenium WebDriver等待元素显示,javascript,node.js,selenium-webdriver,Javascript,Node.js,Selenium Webdriver,我在Google和SO网站上搜索过,我找到了JAVA的答案,但似乎没有找到node.js的答案 我有一个web应用程序,需要时间加载。我希望selenium程序等待页面加载,然后执行一些操作 我目前的代码如下 //依赖项 var webdriver=require('selenium-webdriver'), util=require('util'), _=要求('下划线'); var driver=new webdriver.Builder().withCapabilities(webdriv

我在Google和SO网站上搜索过,我找到了JAVA的答案,但似乎没有找到node.js的答案

我有一个web应用程序,需要时间加载。我希望selenium程序等待页面加载,然后执行一些操作

我目前的代码如下

//依赖项
var webdriver=require('selenium-webdriver'),
util=require('util'),
_=要求('下划线');
var driver=new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build();
var branchName=u.isUndefined(process.argv[3])?'分支“:process.argv[3],
主机名=\ u0.isUndefined(process.argv[2])?'localhost':进程argv[2],
appTmpl='http://%s/%s',
用户名='xxxx',
密码='xxxx';
var appUrl=util.format(appTmpl、主机名、branchName);
获取驱动程序(appUrl);
driver.findElement(webdriver.By.name(“用户名”)).sendKeys(用户名);
driver.findElement(webdriver.By.name(“密码”)).sendKeys(密码);
driver.findElement(webdriver.By.name(“登录按钮”))。单击();
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)
C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\promise.js:1643
投掷误差;
^
NoSuchElementError:没有这样的元素
(会话信息:chrome=37.0.2062.103)
(驱动程序信息:chromedriver=2.10.267521,平台=Windows NT 6.1 SP1 x86_64)
在新的bot.Error(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\atoms\Error.js:109:18)
在Object.bot.response.checkResponse(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\atoms\response.js:106:9)
在C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\webdriver.js:277:20
在C:\Work\study\selenium\node\u modules\selenium webdriver\lib\goog\base.js:1243:15
在webdriver.promise.ControlFlow.runInNewFrame(C:\Work\study\selenium\node\u modules\selenium-webdriver\lib\webdriver\promise.js:1539:20)
通知时(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\promise.js:362:12)
至少(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\promise.js:331:7)
解析时(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\promise.js:309:7)
完成时(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\promise.js:429:5)
在C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\promise.js:1406:10
==异步任务====
WebDriver.findElement(按.name(“用户名”))
在webdriver.webdriver.schedule(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\webdriver.js:268:15)
在webdriver.webdriver.findElement(C:\Work\study\selenium\node\u modules\selenium webdriver\lib\webdriver\webdriver.js:711:17)
反对。(C:\Work\study\selenium\test.js:15:8)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
位于Function.Module.runMain(Module.js:497:10)
启动时(node.js:119:16)

我无意中找到了我问题的答案

因此,要等待元素出现,我们必须:

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

您可以在
webdriver上注册侦听器。请使用
then()


试着这样做:

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

我根据我在这里发现的内容对其进行了一些修改:它很有魅力。

您不需要自定义功能,只需执行以下操作:

let el = await driver.findElement(By.id(`import-file-acqId:${acqId}`));
await driver.wait(until.elementIsVisible(el),100);
await el.sendKeys(file);

请参阅文档。

编写异步函数以避免此问题

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

这是唯一对我有用的东西:

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

我提出这种方法是因为它维护了可链接的承诺语法,这样我就可以编写:
wait waitFind(By.id('abc')).click()


我通常用这种方式:

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

主要问题是webdriver认为元素已经存在,但还没有。我有一个解决方案,丑陋但有效。在webdriver think项目出现后,尝试单击。 获取错误消息:

StaleElementReferenceError: stale element reference: element is not attached to the page document  (Session info: chrome=83.0.4103.106)
没问题,在循环中等待500毫秒,然后再次尝试单击。在我的例子中,5次尝试就足够了,大约2-3次点击就成功了

async clickonitem( driver, itemname ) {
    const strftime = require('strftime');
    var trycounter = 0;
    var timeout = 500;
    var success;
    do {
      try {
        trycounter++;
        success = true;
        console.log( strftime('%F %T.%L'), "Finding #" + trycounter + " " + itemname );
        var item = await driver.wait( until.elementLocated( By.xpath( '//input[@name="' + itemname +'"]' ) ), 
                        timeout );
        console.log( strftime('%F %T.%L'), "Found or Timeout #" + trycounter );
        //await item.click();
        await driver.wait( item.click(), 
                        timeout );
        console.log( strftime('%F %T.%L'), "Click #" + trycounter + " " + itemname );
      } 
      catch(err) {
        success = false;
        //this.log( "Error #" + trycounter + " " + itemname + "\n" +err );
        this.log( strftime('%F %T.%L'), "Error #" + trycounter + " " + itemname + " waiting: " + timeout );
        await wait( timeout );
        continue;
      }

    } while( !success && trycounter < 5 );
}       
        async wait( ms ) {
          return new Promise((resolve) => {
            setTimeout(resolve, ms);
          });
        }

clickonitem( driver, "login_button" );
异步clickonitem(驱动程序、项目名称){
const strftime=require('strftime');
var trycounter=0;
var超时=500;
var成功;
做{
试一试{
trycounter++;
成功=真实;
log(strftime(“%F%T.%L”),“Finding#”+trycounter+“”+itemname);
var item=wait driver.wait(直到.elementLocated(By.xpath('//input[@name=“'+itemname+'“])),
超时);
日志(strftime(“%F%T.%L”),“Found or Timeout”#“+trycounter);
//等待项。单击();
等待驱动程序。等待(项。单击(),
超时);
log(strftime(“%F%T.%L”),“单击#”+trycounter+“”+itemname);
} 
捕捉(错误){
成功=错误;
//此.log(“错误#”+trycounter+“”+itemname+“\n”+err);
此.log(strftime(“%F%T.%L”),“Error#”+trycounter+“+itemname+”waiting:“+timeout”);
等待等待(超时);
继续;
}
}而(!success&&trycounter<5);
}       
异步等待(毫秒){
返回新承诺((解决)=>{
设置超时(解析,毫秒);
});
}
clickonitem(驱动程序,“登录按钮”);

您的站点是否处理ajax请求?如果是这样的话,您是否想过在java中使用javascriptexecutor类来检查node.js标志以获取请求?谢谢您的回答。
isElementPresent
函数在3.0中已被弃用,因此这在新版本中不起作用。@jmreicha您能说明什么在新版本中起作用吗?@AnandSunderraman使用
elementLocated
函数对我有效。@jmreicha elementLocated在spinner加载时被截获,它试图在我的案例中单击按钮!这是一个最新的、惯用的解决方案
StaleElementReferenceError: stale element reference: element is not attached to the page document  (Session info: chrome=83.0.4103.106)
async clickonitem( driver, itemname ) {
    const strftime = require('strftime');
    var trycounter = 0;
    var timeout = 500;
    var success;
    do {
      try {
        trycounter++;
        success = true;
        console.log( strftime('%F %T.%L'), "Finding #" + trycounter + " " + itemname );
        var item = await driver.wait( until.elementLocated( By.xpath( '//input[@name="' + itemname +'"]' ) ), 
                        timeout );
        console.log( strftime('%F %T.%L'), "Found or Timeout #" + trycounter );
        //await item.click();
        await driver.wait( item.click(), 
                        timeout );
        console.log( strftime('%F %T.%L'), "Click #" + trycounter + " " + itemname );
      } 
      catch(err) {
        success = false;
        //this.log( "Error #" + trycounter + " " + itemname + "\n" +err );
        this.log( strftime('%F %T.%L'), "Error #" + trycounter + " " + itemname + " waiting: " + timeout );
        await wait( timeout );
        continue;
      }

    } while( !success && trycounter < 5 );
}       
        async wait( ms ) {
          return new Promise((resolve) => {
            setTimeout(resolve, ms);
          });
        }

clickonitem( driver, "login_button" );