Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试元素可见性的Selenium Webdriver假阴性结果?_Python_Selenium_Selenium Webdriver_Ui Testing - Fatal编程技术网

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

Python 测试元素可见性的Selenium Webdriver假阴性结果?,python,selenium,selenium-webdriver,ui-testing,Python,Selenium,Selenium Webdriver,Ui Testing,我对Selenium Webdriver有问题。我正在对一个web应用程序运行自动测试,并进行了一个检查元素可见性的测试。当我在CLI中运行同一行脚本时,元素被找到并且显示() 我尝试了隐式和显式等待,但等待不是问题所在,元素已经加载 以下是我的测试脚本中的测试用例: def test_image_element_icon_is_displayed(self): self.assertTrue(self.driver.find_element_by_css_selector("#Imag

我对Selenium Webdriver有问题。我正在对一个web应用程序运行自动测试,并进行了一个检查元素可见性的测试。当我在
CLI
中运行同一行脚本时,元素被找到并且
显示()

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

以下是我的测试脚本中的测试用例:

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()
有什么方法可以防止这种假阴性吗?可能正在更改我当前使用的元素选择器

以下是my 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>

形象

在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")))

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

既然这样说了,而且您也提到了元素负载不是一个问题,那么可以安全地假设选择器可能返回了其他一些实际隐藏的元素。我以前也经历过类似的事情,selenium实际上发现了隐藏的元素,而不是预期的元素。实际上,您可以使用
len()
find\u elements\u by\u css\u selector()
来查看返回了多少个元素


使用
ng attr id=“{{toolbarButton.id}}”
或与
[id='image'][ng attr id='something']
协同显示在客户端上的任何内容作为cssSelector

您可以提供元素的一些
html
吗?这里的目标元素是什么?带文本图像的
div
?或者是带id image的div
。但是,我需要找到一种方法,找到一个较短的惟一属性来查找元素,而不是长css@Saifur@MahsaMortazavi你可以。我通常不会像担心长xpath那样担心长css,除非您需要一些漂亮的代码。我不知道长css是否真的会影响执行时间。谢谢@alecxe,这是真的。我以前有过这个问题。然而,在这种情况下,元素被加载了,但#Image不是唯一的选择器。@MahsaMortazavi当然,这是有道理的。谢谢分享。