我试图只点击用户实际上可以看到的元素,即不要点击我当前在网站上滚动到的位置之外的元素。
我设法检测到所有隐藏的元素,但如何获取普通用户只能看到的元素列表。
如果我正确理解你,你正在定位一堆这样的元素:
elements = driver.find_elements_by_xpath("//a")
它会给你一个元素列表。有些元素是可见的,有些则不可见。为了证明这一点,你可以使用这个:
for element in elements:
print(element.is_displayed()) # prints true if displayed, otherwise false
试试这个代码片段:
driver = webdriver.Chrome("C:\\path\\to\\chromedriver.exe")
url = "https://stackoverflow.com/"
driver.get(url)
elements = driver.find_elements_by_xpath("//a") # finds all elements by given xPath
for element in elements: # for every element in elements list
print(element.is_displayed()) # print 'true' if displayed, or 'false' if not
print("DONE")
输出:
False
True
False
True
True
True
True
True
True
False
False
False
False
...
DONE
注意:这只是一个示例,通常您必须等到页面完全加载才能正确定位所有元素并获得它们的正确状态。
编辑:我在这个问题中找到了一个很好的解决方案,在这种情况下的示例代码将是这样的:
driver = webdriver.Chrome("C:\\path\\to\\chromedriver.exe")
url = "https://stackoverflow.com/"
driver.get(url)
time.sleep(3)
elements = driver.find_elements_by_xpath("//span")
def element_in_viewport(driver, elem):
elem_left_bound = elem.location.get('x')
elem_top_bound = elem.location.get('y')
elem_width = elem.size.get('width')
elem_height = elem.size.get('height')
elem_right_bound = elem_left_bound + elem_width
elem_lower_bound = elem_top_bound + elem_height
win_upper_bound = driver.execute_script('return window.pageYOffset')
win_left_bound = driver.execute_script('return window.pageXOffset')
win_width = driver.execute_script('return document.documentElement.clientWidth')
win_height = driver.execute_script('return document.documentElement.clientHeight')
win_right_bound = win_left_bound + win_width
win_lower_bound = win_upper_bound + win_height
return all((win_left_bound <= elem_left_bound,
win_right_bound >= elem_right_bound,
win_upper_bound <= elem_top_bound,
win_lower_bound >= elem_lower_bound)
)
for element in elements:
print(element_in_viewport(driver, element))
print("DONE")
输出:
True
True
True
True
True
True
True
True
True
True
True
True
True
False
True
True
True
True
False
False
False
False
False
False
False
...
DONE
在我看来,这个代码片段效果很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句