Прерывистое сообщение об ошибке «Элемент больше не подключен к DOM» с помощью watir-webdriver - PullRequest
1 голос
/ 24 февраля 2012

Я использую Watir-webdriver 0.5.3. Раньше с версиями около 0.4.x это никогда не было проблемой:

 while  $browser.div(:class =>  /^expander$/).exists?   
  $browser.div(:class => /^expander$/).click; sleep 1.5
 end

Нажатие приводит к выполнению некоторого javascript, который изменяет класс для div, по которому щелкнули, расширяя элемент управления в виде дерева. Цель сценария - продолжать расширять узлы, пока не останется ни одного нерасширенного.

Я часто получаю "Элемент больше не подключен к DOM" в строке .exists? , которая является esp. беспокоит, потому что причина, по которой я начал широко использовать .exists?, заключалась в том, чтобы избежать таких ошибок, которые сразу же приводят к аварийному завершению сценария.

визуально я наблюдаю расширение почти сразу после .click, и если я тут же приостанавливаю работу, Firebug подтверждает, что div с только class = 'expander' был заменен на его место div с class = 'expander hasChildren extended' и только этот div.

Ошибка веб-драйвера.

Кто-нибудь еще имел эту проблему или рекомендовать обходные пути?

В более раннем вопросе мне нужно было переключиться на форму /^expander$/, чтобы точно соответствовать только этому классу, после изменения нового поведения watir-webdriver.

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

А как насчет этого?

while  $browser.div(:class =>  /^expander$/).exists?
  count = $browser.divs(:class => 'expander hasChildren expanded').size   
  $browser.div(:class => /^expander$/).click
  $browser.wait_until{$browser.div(:class => 'expander hasChildren expanded', :index => count).exists?}
 end

Другой подход, который я использовал, когда действия заставляют вещи уходить, это подсчет, а затем работа по индексу от последнего элемента к первомуТаким образом, «следующая вещь», к которой вы обращаетесь, должна существовать.Это может быть более надежным, чем постоянное обращение к «первому», когда ваше предыдущее действие только что убрало «первый».Если расширение открывает новые классы «расширителей», то вам, возможно, придется делать это волнами, когда вы заканчиваете расширением первого уровня, затем второго и т. Д., Пока не увидите, что их больше не будет.это может означать создание метода для расширения всех видимых в настоящее время расширителей, затем проверка, когда это будет сделано, чтобы увидеть, есть ли какие-либо видимые расширители, и, если это так, вызовите метод еще раз.

1 голос
/ 24 февраля 2012

Попробуйте это

Watir::Wait.until do
  $browser.div(:class => /^expander$/).click
  not $browser.div(:class => /^expander$/).exists?
end
0 голосов
/ 02 марта 2012

Следуя подходу Чака этот код также сначала перечисляет всех кандидатов, которым нужно щелкнуть, чтобы развернуться или что-то еще, а затем в цикле foreach в одну строку щелкает их снизу вверх по странице:

hitlist = $browser.divs(:class => /^expander$/)  # put all candidates into an array

hitlist.to_a.reverse.each {|r| r.click; sleep 0.1}  # loop in reverse

$browser.wait_until { $browser.divs(:class => /^expander$/).size < 1}  # Wait until they're all AJAXed out of existence

Строки 1 и 2 могут даже быть сжаты до просто $browser.divs(:class => /^expander$/).to_a.reverse.each {|r| r.click; sleep 0.1}, если вы не думаете, что временная коллекция hitlist может быть полезна для ... но не имеет значения.

Несмотря на то, что код выглядит здравым, мое главное беспокойство здесь заключается в очень серьезном снижении производительности при использовании локатора регулярных выражений, такого как /^expander$/, по-видимому, ... не то, что вам говорят в документах!Не то, с чем я сталкивался до 0.5.3, когда стандартные, цитируемые локаторы классов, такие как :class => "expander", были сопоставлены исключительно.

Один или два раза было бы простительно (в моем случае нахождение div(:class => /^expander$/) занимает от 5 до 50 секунд в<100kB html page <em>каждый раз ), но меня особенно беспокоит строка 3: кто останется, сколько раз будет выполняться {boolean test block} для опроса, если условие наконец выполнено?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...