Watir-webdriver, не может «привести» элемент к подтипу, даже если он найден - PullRequest
1 голос
/ 13 декабря 2011

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

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

HTML of the input tag В любом случае вот мой код, который использует 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: в `assert_exists ': невозможно найти элемент, используя {: xpath =>" // div [@ class =' ​​ap_popover '] / input [@ name = 'lastName'] "} (Watir :: Exception :: UnknownObjectException)

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

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

Спасибо!

1 Ответ

4 голосов
/ 13 декабря 2011

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

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

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

Если у вас есть какой-то дурацкий недопустимый HTML-код, в котором у них есть две копии всего этого материала (и, следовательно, дублированные значения идентификатора, что недопустимо для стандарта HTML), вы можете добавить в INDEX элемент, который в этом случае может быть требуется как для контейнера 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)
...