通过硒,Python中的xpath检测用户可见元素(仅在视口中)

J·多伊

我试图只点击用户实际上可以看到的元素,即不要点击我当前在网站上滚动到的位置之外的元素。

我设法检测到所有隐藏的元素,但如何获取普通用户只能看到的元素列表。

安德烈·苏沃科夫

如果我正确理解你,你正在定位一堆这样的元素:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查元素是否在视口中可见

来自分类Dev

使用overflow:hidden检测div是否在其他元素之上(在视口中可见)

来自分类Dev

视口中有多少元素可见

来自分类常见问题

jQuery检查元素是否在视口中可见

来自分类Dev

硒:通过可见文本查找元素

来自分类Dev

硒:通过可见文本查找元素

来自分类Dev

在视口中变换内容的可见部分

来自分类Dev

元素仅在 Inspector、SVG 中可见

来自分类Dev

python中的硒通过相对xpath查找元素

来自分类Dev

CSS3-Animate元素(如果在视口中可见)(页面滚动)

来自分类Dev

在<footer>元素可见时(在视口中)添加一个类

来自分类Dev

有什么方法可以仅使用javascript检查元素在视口中是否可见?

来自分类Dev

Javascript 元素在没有边距的视口中可见

来自分类Dev

硒下拉列表中的元素不可见异常

来自分类Dev

在视口中可见时,延迟链中的CSS动画延迟

来自分类Dev

硒可见元素无法识别为可见元素

来自分类Dev

菜单中的用户令牌仅在清除缓存后可见。

来自分类Dev

当对象在视口中可见时执行操作

来自分类Dev

Python:如何检测 Tkinter 中的可见形状检测

来自分类Dev

硒元素不可见异常

来自分类Dev

元素不可见,硒

来自分类Dev

硒元素不可见

来自分类Dev

Python XPATH Selenium元素没有可见的文本结果

来自分类Dev

通过JavaScript使元素可见

来自分类Dev

如何检测DOM元素是否部分不在视口中

来自分类Dev

硒与python的奇怪行为。看不到真正可见的元素

来自分类Dev

在python中使用硒,如何克服“消息:元素当前不可见”的问题?

来自分类Dev

无法单击硒中的列表按钮选项:异常元素不可见

来自分类Dev

单击硒中某个类的第一个可见元素

Related 相关文章

热门标签

归档