Watir 6.15.0 +
Element#obscured?
был добавлен для проверки этого сценария.Теперь вы можете сделать:
browser.element(id: 'target').wait_while(&:obscured?).click
Watir pre-6.15.0
Для более старых версий вам потребуется другой подход.
Я бы попытался подождать, пока перекрывающийся элемент исчезнет.Если перекрытие является чем-то вроде наложения, которое в конечном итоге исчезнет, это относительно просто - например:
browser.element(id: 'overlapping_element').wait_while(&:present?)
Если перекрывающийся элемент перемещается, а не исчезает, или вы не знаете перекрывающийся элемент, вы можете попробоватьаппроксимируя проверку перекрывающихся элементов.Когда Chrome щелкает элемент, он получает его центральное положение и затем щелкает в этой точке.Если элемент верхнего уровня в этой точке не является вашим элементом, возникает исключение.Следующее ожидание выполнит эту проверку, пока не будет перекрывающегося элемента:
target = browser.button
target_children = target.elements.to_a
browser.wait_until do
location = target.location
size = target.size
center = [location.x + size.width/2, location.y + size.height/2]
element_at_point = browser.execute_script("return document.elementFromPoint(#{center[0]}, #{center[1]});")
[target, target_children].flatten.include?(element_at_point)
end
target.click
Обратите внимание, что мне раньше не приходилось делать это, поэтому я не знаю, есть ли крайние случаи.Похоже, работает с Chrome и Firefox.