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
我对 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