我遇到了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>
答案 0 :(得分:4)
我很确定这个ID不能是唯一的,因为它位于ng-repeat
中并且它可能正在加载多个具有相同ID但不安全的元素。
说到那个,因为你也提到元素加载不是问题,可以安全地假设选择器可能正在返回一些实际隐藏的其他元素。我之前经历过类似的事情,其中硒实际上发现了隐藏的元素并且不是预期的元素。您实际上可以将len()
与find_elements_by_css_selector()
一起使用,以查看返回了多少元素。
使用ng-attr-id="{{toolbarButton.id}}"
或客户端显示的任何内容与[id='image'][ng-attr-id='something']
作为cssSelector进行联合
答案 1 :(得分:3)
在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")))