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

Selenium Webdriver false negative result for testing visibility of an element?

我对 Selenium Webdriver 有疑问。我正在 运行 对 Web 应用程序进行自动化测试,并进行测试以检查元素的可见性。当我 运行 在 CLI 中的同一行脚本时,找到了元素 is_displayed() returns "TRUE" 但是当我 运行 它与其他通过我的 Python IDE, is_displayed() returns 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()

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

这是我的图像元素的 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>

运行 Python 终端中的代码与 运行 作为脚本的代码之间的主要区别在于,在终端上执行的每一行之间都有 pauses/delays - 这使页面有时间处理异步请求、更新 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")))

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

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

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