Я пытаюсь изучить автоматизацию с помощью webdriverio в nodejs прямо сейчас, по общему признанию, не очень хорошо разбираясь в jquery в HTML. вот где я:
Я написал скрипт, который до сих пор успешно регистрирует меня в учетной записи и переходит на нужную страницу. Моя цель - сделать бронирование, но когда я нажимаю на элемент бронирования, появляется всплывающее окно с некоторыми предварительно загруженными данными и кнопкой «Сделать бронирование», которая при нажатии запускает функцию 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>
До сих пор я пытался щелкнуть по нему, используя это (это код после моего «клиентского» объявления)
.execute(executeFunction).then(function(resp){
console.log('execute function status:',resp.state) // should log true if element is there
})
.waitForExist('#ctl00_ctrl_MakeBookingTime_lbBook').then(function(exists){
console.log('button exists status:',exists.state) // should log true if element is there
})
.elements('#ctl00_ctrl_MakeBookingTime_lbBook').then(function(resp){
console.log('element found status: ',resp);
return; //wait for the popup to load before executing the click
}).click('=Make Reservation') //this is the line that doesn't seem to work
эта последняя строка не работает. Как вы видите, я использую регулярное выражение в качестве элемента запроса, но я также попробовал только идентификатор элемента напрямую, как было предложено здесь. Я также пытался вручную выполнить функцию javascript в ссылке HREF, но это просто закрывает окно, фактически не делая резервирования:
.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")]"}
Кажется, последняя часть не работает. Спасибо, что указали мне на журналы. Странно то, что когда я напрямую меняю регулярное выражение только на идентификатор, оно все равно выдает эту ошибку:
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
Я ввел журнал в функции .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...