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:в `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
Вместо да правите елемент --› подтип. Можете ли да го получите директно 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, където те имат две копия на всички тези неща (и по този начин дублирани ID стойности, които не са валидни за стандарта 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