Javascript Can';t使用webdriverio单击web按钮

Javascript Can';t使用webdriverio单击web按钮,javascript,jquery,html,node.js,webdriver-io,Javascript,Jquery,Html,Node.js,Webdriver Io,我现在正试图学习在nodejs中使用WebDrivero实现自动化,当然,我对HTML中的jquery了解不多。我就在这里: 我已经编写了一个脚本,到目前为止,它成功地将我登录到一个帐户并导航到我想要的页面。我的目标是预订——但当我单击预订项目时,会出现一个弹出窗口,其中包含一些预加载的数据和“预订”按钮,单击该按钮会运行javascript函数。但是,我无法成功地重新创建实际的单击 按钮的HTML如下所示: <div class="inside"> <

我现在正试图学习在nodejs中使用WebDrivero实现自动化,当然,我对HTML中的jquery了解不多。我就在这里:

我已经编写了一个脚本,到目前为止,它成功地将我登录到一个帐户并导航到我想要的页面。我的目标是预订——但当我单击预订项目时,会出现一个弹出窗口,其中包含一些预加载的数据和“预订”按钮,单击该按钮会运行javascript函数。但是,我无法成功地重新创建实际的单击

按钮的HTML如下所示:

<div class="inside">
            <ul class="toolBtns">

                <li id="ctl00_ctrl_MakeBookingTime_liCancelChanges" class="cancelChanges">
                    <a id="ctl00_ctrl_MakeBookingTime_lbCancelChanges" href="javascript:__doPostBack('ctl00$ctrl_MakeBookingTime$lbCancelChanges','')">Discard Changes</a></li>
                <li id="ctl00_ctrl_MakeBookingTime_liBook" class="bookRes">
                    <a id="ctl00_ctrl_MakeBookingTime_lbBook" href="javascript:__doPostBack('ctl00$ctrl_MakeBookingTime$lbBook','')">Make Reservation</a></li>
            </ul>               
        </div>
最后一行是行不通的。如您所见,我使用正则表达式作为查询元素,但我也按照建议直接尝试了item ID。我还尝试在HREF链接中手动执行javascript函数,但这只是取消了窗口,而没有实际进行预订:

.execute("javascript:__doPostBack('ctl00$ctrl_MakeBookingTime$lbBook")
我猜在doPostBack函数中有一些我不理解的参数

任何建议或其他文章的链接都将非常有用。我已经找了好几个小时了,还没完全弄明白。谢谢

更新 :ChristianB请求获取日志,如下所示:

2:32:16.747 INFO - Done: [execute script: javascript:LaunchLockedReserver(this,event,'54','200','12/19/2015','9:15 AM','2');, []]
12:32:16.752 INFO - Executing: [find elements: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]])
12:32:16.766 INFO - Done: [find elements: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]]
12:32:17.023 INFO - Executing: [find elements: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]])
12:32:17.038 INFO - Done: [find elements: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]]
12:32:17.303 INFO - Executing: [find elements: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]])
12:32:17.303 INFO - Executing: [find element: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]])
12:32:17.311 INFO - Done: [find elements: By.xpath: //*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]]
12:32:17.568 WARN - Exception thrown
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[contains(@id, "ctl00_ctrl_MakeBookingTime_lbBook") and contains(., "Make Reservation")]"}
看来最后一块不起作用了。谢谢你给我指点日志。奇怪的是,当我直接将正则表达式更改为ID时,仍然会出现错误:

12:38:33.483 WARN - Exception thrown
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"ctl00_ctrl_MakeBookingTime_lbBook"}
我会继续尝试并检查日志

更新#2 我为我运行的每个函数(参见上面更新的代码)和.waitForExists函数都加入了.then函数的日志记录,而.waitForExists函数似乎从未运行过。运行函数后,我的控制台输出如下所示:

execute function status: success
Error: element (#ctl00_ctrl_MakeBookingTime_lbBook) still not existing after 500ms
at elements("#ctl00_ctrl_MakeBookingTime_lbBook") - isExisting.js:43:17
at isExisting("#ctl00_ctrl_MakeBookingTime_lbBook") - waitForExist.js:31:21

基本上,它似乎从.execute直接转到.elements函数

您可能使用了
.waitForExist
错误

从。一旦
ms
用完,它的Future将根据是否找到选择器返回一个布尔值

.waitForExist(选择器[,ms][,反向]),然后(回调)

ms
reverse
是可选的。您需要默认值,在wdio配置文件中为
ms
设置默认值

要验证是否找到该元素,可以执行以下操作:

waitForExist('#ctl00_ctrl_MakeBookingTime_lbBook')。然后(函数(exists){
console.log(exists)//如果元素存在,则应记录为true
})

您不需要尝试部分匹配“makereservation”,因为id选择器应该是唯一的

更新:

期货是有链子的,很难说未来在哪里打破了链子。有时,当我无法确定某个东西是否有问题时,我会在每个被链接的成员之间打电话,我知道会有一些东西返回,比如

.getTitle().then(function(title){
    console.log(title);
});
属性
存在。状态
不可用。虽然它不在文档中,但我已经验证了waitForExists解析为true或false。如果不确定传入的参数,可以使用
console.log(arguments)
以数组形式获取参数。请勿将其用于生产。尝试在waitForExist.then()回调中执行此操作,以查看您拥有的内容

您不应该需要
元素
(即使这可能不是问题的根源)。如果您只想单击一个按钮
,那么应该单击(#ctl00\u ctrl\u MakeBookingTime\u lbBook)

你能详细描述一下下面的代码吗?它还可能影响未来链条的其他部分。您能否输出
console.log(参数)
并发布它

.execute(executeFunction).then(function(resp){
  console.log('execute function status:',resp.state) // should log true if element is there
  console.log(arguments);
})

你能提供硒日志吗?希望查看单击是否成功,以及元素是否均匀exists@ChristianB刚把它们添加到原来的帖子里。谢谢你给我指点日志。它似乎找不到元素。我将看看是否可以修复元素选择器。我不明白的是,.waitForExist函数和.click函数使用相同的选择器参数,但是.click函数找不到元素。请尝试这样做:“.click(''ctl00'u ctrl_MakeBookingTime'u lbBook')”应该只有一个具有该id的元素。是的,我尝试过了,仍然没有找到元素。请参阅我原始帖子中的最后一个日志,了解该尝试的selenium日志。是否有可能我的waitForExist函数工作时间不够长,无法加载弹出窗口?谢谢garrickajo的建议。我更新了原始帖子,以显示我现在使用的代码。奇怪的是,.waitForExist函数根本没有输出任何文本。我不知道为什么,但它似乎完全跳过了这个函数(我把控制台输出放在原来的帖子中)。我修改了我的wdio.config.js文件,并将超时设置为10秒,但即使是.elements函数也似乎出错了。不太清楚为什么。
.execute(executeFunction).then(function(resp){
  console.log('execute function status:',resp.state) // should log true if element is there
  console.log(arguments);
})