Методы существования объекта Watir/Page Timeing
Я недавно обновился с:
- Объект страницы 1.2.2
- Watir-Webdriver 0,9,9
- Selenium WebDriver 2.53.0
- Firefox 45.8.0
Для того, чтобы:
- Объект страницы 2.2.0
- Watir 6.3.0
- Selenium-Webdriver 3.4.3
- Firefox 52.2.0
После небольшого количества боли я наконец получил свои тесты, чтобы начать бежать! Одна маленькая загвоздка, хотя. Методы #present?
, #exists?
, а также #visible?
ничего не возвращайте, вместо этого они просто тайм-аут. Так же, #wait_until
, x_element.when_present?
и подобные методы все сталкиваются с той же проблемой!
Вот мой объект страницы:
class LoginPage < TeamConnectPage
MAX_LOGIN_ATTEMPTS = 3
button :ok, value: /^OK$/i
button :submit, value: 'Login'
button :new_session, value: 'New Session'
link :logout, id: 'LINK_default_logout'
span :error_message, class: 'texterror'
text_field :username, name: 'j_username'
text_field :password, name: 'j_password'
def login_as(username)
username = username.to_s
do_logout if logged_in?
attempts = 0
try_login(username)
while username_element.present?
fail "#{MAX_LOGIN_ATTEMPTS} logins attempted unsuccessfully for user #{username}" if (attempts+=1) == MAX_LOGIN_ATTEMPTS
try_login(username)
end
if new_session_element.present?
new_session
logout_element.when_present(10)
end
end
private
def try_login(username)
self.username = username
self.password = 'test'
submit
wait_for_login_submit
end
def wait_for_login_submit
wait_until(10) { !username_element.present? || (username_element.present? && username_element.value.empty?) }
wait_until(10) { error_message_element.present? || logout_element.present? || new_session_element.present? }
end
def do_logout
logout
end
def logged_in?
logout_element.present?
end
end
Вот определение шага, где я вызываю объект страницы:
def login_role role
caps = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
@browser ||= Watir::Browser.new(:firefox, desired_capabilities: caps)
@browser.driver.manage.window.maximize
@browser.goto('http://ntdmatters-it4.nwie.net/TeamConnect/login')
@logged_in_user = User[RoleMapping[role]]
on_page(LoginPage).login_as(@logged_in_user.userid)
end
Вот мой порядок загрузки:
require 'pry'
require 'active_support'
require 'active_support/core_ext'
require 'chronic'
require 'page-object'
require 'rspec'
require 'watir'
require 'selenium-webdriver'
И вот ошибка, которую я получаю:
timed out after 30 seconds, waiting for #<Watir::Anchor: located: false; {
:id=>"LINK_default_logout", :tag_name=>"a"}> to be located (Watir::Exception::UnknownObjectException)
(eval):1:in `process_watir_call'
./features/support/env.src/pages/login_page.rb:48:in `do_logout'
./features/support/env.src/pages/login_page.rb:15:in `login_as'
./features/step_definitions/login_steps.rb:24:in `login_role'
./features/step_definitions/login_steps.rb:2:in `/^I login to Project
with role (.*)$/'
Что происходит, что сценарий ударит, что #logged_in?
метод и просто сидеть там. Затем произойдет тайм-аут и выдаст вышеуказанное сообщение об ошибке.
Я не могу не задаться вопросом, если это какая-то проблема конфигурации и что вещи просто должны быть загружены правильно или есть какая-то более глубокая ловушка, в которую я попал.
РЕДАКТИРОВАТЬ:
Когда я изменил уровень регистратора Selenium на "Info", я получил следующее повторение в течение 30 секунд:
2017-07-12 12:11:21 INFO Selenium >>> http://127.0.0.1:4444/session/8d74a28f-
d8fc-4db6-a851-4f238edf7d70/element | {"using":"css selector","value":"#LINK_def
ault_logout"}
2017-07-12 12:11:21 INFO Selenium <- {"value":{"error":"no such element","messag
e":"Unable to locate element: #LINK_default_logout","stacktrace":"stack backtrac
e:\n 0: 0x4bd56f - <no info>\n 1: 0x4bdcc9 - <no info>\n
2: 0x43dc4d - <no info>\n 3: 0x44db84 - <no info>\n 4
: 0x44a1ca - <no info>\n 5: 0x4207bc - <no info>\n 6:
0x405e47 - <no info>\n 7: 0x6db3d9 - <no info>\n 8:
0x417847 - <no info>\n 9: 0x6d56d3 - <no info>\n 10: 0x
776c59cd - BaseThreadInitThunk"}}
EDIT2: это происходит независимо от того, присутствует элемент или нет.