2015-04-05 114 views
2

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

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

下面是测试案例在我的测试脚本:

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> 
+0

你能提供的元素的某些'html'? – Saifur 2015-04-05 22:31:47

+0

这里的目的是什么?带文字的'div'*图片*?或具有ID *图像*的'div'? – Saifur 2015-04-05 22:38:48

+0

@Saifur与图像编号 – Mahmor 2015-04-05 22:43:01

回答

4

我敢肯定,这个ID不能独特因为它在ng-repeat,它可能会加载多个相同ID的元素,即而不是可以安全使用。

由于这样说和既然,你也提到元素负载不是一个问题,它可以安全地假设选择器可能返回实际上隐藏的其他元素。在硒实际上发现了隐藏的元素并且不是预期元素之前,我经历了类似的事情。您实际上可以使用len()find_elements_by_css_selector()来查看返回了多少个元素。

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

+0

谢谢,我使用了Image元素的整个CSS,它工作正常。但是,我需要找到一种方法来找到一个较短的唯一属性来查找不是长css的元素。 @Saifur – Mahmor 2015-04-05 22:54:35

+1

@MahsaMortazavi你可以。除非你需要一些漂亮的代码,否则我通常不会像长xpath一样担心长css。我不知道长时间的CSS会不会严重影响执行时间 – Saifur 2015-04-05 22:56:22

+0

这是一个不错的更新:) – alecxe 2015-05-27 06:23:43

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"))) 
+0

感谢@alecxe,这是真的。我之前有这个问题。但是在这种情况下,该元素已加载,但#Image不是唯一的选择器。 – Mahmor 2015-04-05 22:56:00

+0

@MahsaMortazavi当然,这是有道理的。感谢分享。 – alecxe 2015-04-05 22:57:31

相关问题