Следуя подходу Чака этот код также сначала перечисляет всех кандидатов, которым нужно щелкнуть, чтобы развернуться или что-то еще, а затем в цикле 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}
для опроса, если условие наконец выполнено?