Watir-webdriver не может привести элемент к подтипу, даже если он найден

У меня действительно странная проблема с watir-webdriver.

Вот снимок входного тега, который я пытаюсь получить (не смог найти способ получить источник после того, как javascripts создал всплывающее окно, смеется)

HTML входного тегаВо всяком случае, вот часть моего кода, который использует xpath для поиска этих элементов (есть два текстовых поля и тег выбора)

firstname = b.element(:xpath, "//div[@class='ap_popover']/input[@name='firstName']")
lastname =  b.element(:xpath, "//div[@class='ap_popover']/input[@name='lastName']")
authorselector = b.element(:xpath, "//div[@class='ap_popover']/select")
puts firstname
puts lastname
puts authorselector

Этот код успешно возвращает объекты элемента watir. Однако, когда я пытаюсь их бросить:

puts firstname.to_subtype

это бесит:

C:/Ruby192/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.4.1/lib/watir-webdriver/elements/element.rb:262:in `assert_exists': невозможно найти элемент, используя {:xpath=>"//div[@class='ap_popover']/input[@name='lastName']"} (Watir::Exception::UnknownObjectException)

Так что же происходит? Он может найти их через xpath без проблем, но потом, когда я пытаюсь их разыграть, поиск xpath внезапно терпит неудачу?

Стоит отметить, что html, который я просматриваю, полностью создан с помощью javascript, поэтому я не мог просто скопировать\вставить его сюда и должен был сделать снимок экрана.

Спасибо!


person dsp_099    schedule 12.12.2011    source источник
comment
Вместо того, чтобы делать element --› subtype. Вы можете получить к нему прямой доступ b.textfield(:name => 'firstName') . Недавно у меня были unable to located element проблемы с watirwebdriver...   -  person Kassym Dorsel    schedule 13.12.2011
comment
Точно не находит. На странице есть еще один, который служит «прототипом» для загрузки javascript, но он постоянно скрыт, и вы не можете (и не должны) взаимодействовать с ним. Так что да, он находит текстовое поле с таким именем, но находит неправильное. Как будто он не понимает, что html был дополнен.   -  person dsp_099    schedule 13.12.2011
comment
В этом случае b.text_fields(:name => 'firstName') должен вернуть оба из них, и вы можете выбрать второй.   -  person Kassym Dorsel    schedule 13.12.2011
comment
Почему вы пытаетесь создать элемент ввода в первую очередь?   -  person Chuck van der Linden    schedule 13.12.2011


Ответы (1)


xpath - это зло, избегайте его, если это вообще возможно. слишком легко делать ошибки, трудно читать и, как правило, медленнее.

Вы пробовали что-то вроде

b.div(:id => 'contributors-table').textfield(:name => 'firstName')

Если у вас есть какой-то дурацкий недействительный HTML, где у них есть две копии всего этого материала (и, следовательно, дублированные значения идентификатора, которые недействительны для стандарта HTML), вы можете добавить в ИНДЕКС элемента, который в этом случае может понадобиться как для контейнер div, а затем, возможно, и для поля ввода, если их больше одного.

b.divs(id => 'contributors-table').size  #how many are there?

#example, second instance of the contributors table, third instance in that table of an text input field with the name 'firstName'
b.div(:id => 'contributors-table', :index => 1).textfield(:name => 'firstName', :index => 2)
person Chuck van der Linden    schedule 13.12.2011