“元素目前不可见,因此可能无法与之交互”但另一个是?

我创建了另一个问题,我认为是导致此错误的原因: 为什么Selenium Firefox驱动程序认为当父级溢出时我的模态不显示:隐藏?

Selenium版本2.33.0
Firefox驱动程序

导致错误的代码:

System.Threading.Thread.Sleep(5000); var dimentions = driver.Manage().Window.Size; var field = driver.FindElement(By.Id("addEmployees-password")); //displayed is true field.Click(); //works fine var element = driver.FindElement(By.Id(buttonName)); //displayed is false element.Click(); //errors out 

它试图点击的按钮:

  
  • 如果我将调用更改为FindElements那么我会得到一个元素,因此页面上没有其他内容。
  • 如果我在按钮之前发生的字段上的FindElement ,比如addEmployees-employee ,则displayed addEmployees-employee
  • 在浏览器本身,它显示正常,我需要做的只是单击按钮并执行所需的行为,但webdriver拒绝考虑显示的元素

如何将一个字段视为显示而另一个字段不显示?

在此处输入图像描述

右下方带有添加按钮的模态,显示所有其他元素= true

每个driver.Manage().Window.Size;的窗口大小为1200×645.Manage driver.Manage().Window.Size;
元素位置为:每个driver.FindElement(By.Id(buttonName)).Location
元素维数为:每个driver.FindElement(By.Id(buttonName)).Size
密码元素位置为:每个driver.FindElement(By.Id("addEmployees-password")).Size

Selenium WebDriver不仅检查不透明度!= 0,visibility = true,height> 0并且在当前元素上显示!= none,但它还搜索DOM的祖先链以确保没有父元素也是匹配这些跳棋。 ( 更新在查看了所有绑定引用的JSON线代码之后,SWD还需要溢出!=隐藏 , 以及 其他一些 情况 。)

在@Brian建议重构代码之前,我会做两件事。

  1. 确保“div.modal_footer”元素没有任何理由让SWD认为它不可见。

  2. 注入一些Javascript以在浏览器中突出显示有问题的元素,这样您就知道您已经选择了正确的元素。 您可以使用此要点作为起点。 如果按钮以黄色边框突出显示,则表示您已选择正确的元素。 如果不是,则表示所选元素位于DOM中的其他位置。 如果是这种情况,您可能没有您期望的唯一ID,这使得DOM的操作非常混乱。

如果我不得不猜测,我会说第二个是你遇到的。 这也发生在我身上,其中Dev重用了一个元素ID,导致争用你应该找到哪个元素。

Brian的回答是正确的:使用明确的等待而不是Thread.Sleep()。 睡眠()通常是脆弱的,你不必要地失去五秒钟,而且它只是一个非常糟糕的自动测试练习。 (我花了很长时间才知道这一点,所以你并不孤单。)

避免隐式等待。 它们通常用于添加到DOM中的新项目,而不用于像模式变为活动的过渡。

显式等待有一组很好的预期条件( 详见Javadox ),可以让你解决这些问题。 使用与您下一步操作所需的状态相匹配的ExpectedCondition。

另外,请参阅Ian Rose关于该主题的精彩博文 。

在聊天中与你讨论这个问题后,我认为最好的解决方案(至少目前为止)是将按钮从页脚移出你的模态并进入它的主体。

这就是你想要的(现在):

  

而不是这个:

   

我有相同的元素问题不可见,因此无法与之交互。 它刚刚解决了。 我更新了我的selenium独立服务器。 之前的版本是2.33.0 ,现在是2.35.0

在我的情况下,元素已经存在于页面中,但它被禁用,所以这不起作用(python):

 wait.until(lambda driver: driver.find_element_by_id("myBtn")) driver.find_element_by_id("myBtn").click() 

它失败了,错误:

 “Element is not currently visible and so may not be interacted with" 

为了解决我的问题,我不得不等待几秒钟( time.sleep(5) )直到元素变得可见。

您还可以使用JavaScript启用该元素,这是一个python示例:

 driver.execute_script("document.getElementById('myBtn').disabled='' ") driver.execute_script("document.getElementById('myBtn').click() ") 
Interesting Posts