Selenium Webdriver 测试元素可见性的假阴性结果?

Posted

技术标签:

【中文标题】Selenium Webdriver 测试元素可见性的假阴性结果?【英文标题】:Selenium Webdriver false negative result for testing visibility of an element? 【发布时间】:2015-04-05 22:20:41 【问题描述】:

我遇到了 Selenium Webdriver 的问题。我正在针对 Web 应用程序运行我的自动化测试,并进行测试以检查元素的可见性。当我在CLI 中运行同一行脚本时,找到了该元素并且is_displayed() 返回“TRUE”,但是当我通过我的Python IDE 与其他测试用例一起运行它时,is_displayed() 返回False

我尝试了隐式和显式等待,但等待不是问题,并且元素已经加载。

这是我的测试脚本中的测试用例:

def test_image_element_icon_is_displayed(self):
    self.assertTrue(self.driver.find_element_by_css_selector("#Image").is_displayed(),msg="Image is not displayed")

这是我在 CLI 中运行的脚本:

 driver.find_element_by_css_selector("#Image").is_displayed()

有什么方法可以防止这种假阴性吗?也许更改我当前使用的元素选择器?

这是我的 Image 元素的 html

<div ng-click="applyDataElement(toolbarButton.type, toolbarButton.id)" class="frame-click ng-scope" ng-repeat="toolbarButton in toolbar">
                <div class="frame-box" ng-attr-id="toolbarButton.id" id="Image">
                    <div class="draggable-box">
                        <div bind-html-unsafe="toolbarButton.icon" class="draggable-icon ng-binding"><i class="fa fa-picture-o"></i></div>
                        <div class="draggable-label ng-binding">Image</div>
                    </div>
                </div>
            </div>

【问题讨论】:

你能提供一些html的元素吗? 这里的预期元素是什么? div 带有文本 Image?或者div id image? @Saifur 带有图像 id 的 div 【参考方案1】:

我很确定这个 id 不能是唯一的,因为它在 ng-repeat 中,并且它可能加载了多个具有相同 id 的元素,可以安全使用。

话虽如此,而且由于您还提到元素加载不是问题,因此可以安全地假设选择器可能正在返回一些实际上隐藏的其他元素。我之前经历过类似的事情,硒实际上发现了隐藏的元素,而不是预期的元素。您实际上可以使用 len()find_elements_by_css_selector() 来查看返回了多少元素。

使用ng-attr-id="toolbarButton.id" 或客户端上显示的任何内容与[id='image'][ng-attr-id='something'] 作为cssSelector

【讨论】:

谢谢,我使用了 Image 元素的整个 css 并且效果很好。但是,我需要找到一种方法来找到更短的唯一属性来查找元素而不是长 css。 @赛弗 @MahsaMortazavi 你可以。除非您想要一些漂亮的代码,否则我通常不会像对长 xpath 那样担心长 css。我不知道长 css 是否真的会影响执行时间【参考方案2】:

在 Python 终端中运行代码和将其作为脚本运行之间的主要区别在于,在终端上,您执行的每一行之间都有暂停/延迟 - 这为页面提供了处理异步请求、更新 DOM 等的时间。在您的测试代码中,您需要等待元素变得可见

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


wait = WebDriverWait(driver, 10)
image = wait.until(EC.visibility_of_element_located((By.ID, "Image")))

【讨论】:

谢谢@alecxe,这是真的。我以前有这个问题。但是在这种情况下,元素已加载,但 #Image 不是唯一的选择器。 @MahsaMortazavi 当然,这是有道理的。感谢分享。

以上是关于Selenium Webdriver 测试元素可见性的假阴性结果?的主要内容,如果未能解决你的问题,请参考以下文章

Selenium Webdriver:元素不可见异常

如何强制Selenium WebDriver点击当前不可见的元素?

Selenium C# Webdriver如何检测元素是不是可见

Selenium Webdriver Python - 检查元素是不是可见/检测到/存在[重复]

如何解决 ElementNotInteractableException:元素在 Selenium webdriver 中不可见?

自动化测试——Selenium+Python判断元素是否可见,及元素未出现时设置超时时限