`
m635674608
  • 浏览: 5029608 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

webdriver报不可见元素异常方法总结

 
阅读更多
最近一直在学Selenium相关东西,学到webdriver这块,出现报不可见元素异常方法异常,后来网上找了好多相关资料都没搞定,也没看明白,最后发现是xpath中写了calss属性有问题。现在把学习到的方法和实际解决的方法总结一下,留个记号。
 

1.      关于存在不可见属性的元素,对元素操作时,出现报如下异常的情况及处理办法:

 

Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with Command duration or timeout: 31 milliseconds

 

首先,得排除是否是定位的xpath路径有问题,如果是用xpath定位,其中用@class属性来定位,也会报这个错误(特别是class中含有复合类的定位)。下面用备份软件删除任务的弹出div区中的确认按钮定位为例:

WebElement cf_button=driver.findElement(By.xpath("//div[@class='ui-dialog-buttonset']"));

用上面的class定位,也是有问题的。用下面的路径也是有问题的,都会报上面提到的异常内容。

Xpath=//div[@class=ui-dialog-buttonpane ui-widget-content ui-helper-clearfix]/div/button

这个xpath中的class属于复合类。

如果用下面的定位,就不会报这个异常:

WebElement cf_button=driver.findElement(By.xpath("//div[4]/div[3]/div[1]/button"));

上面的元素定位,可通过元素对象的方法isDisplayed()检测元素是否可显示的,如果得到不可显示,操作该元素时会报上面提到的异常,检测语句如下:

   if(!(cf_button.isDisplayed())){System.out.println("Element is not displayed!"); };

2种情况:就是元素的样式或父级及以上元素含有不可显示属性,以致在有些浏览器中(FirefoxDriver)不能操作,但在正常的浏览器中它是可见和可用的。那么需要检查元素是否具备如下特性:

  • visibility!= hidden
  • display != none (is also checked against every parent element)
  • opacity != 0 (in rc2 this is no longer checked for clicking an element)
  • height and width are both > 0
  • for an input, the attribute type != hidden

如果有不符上面的特性之一,那么就用js脚本来处理,这个解决方案的原英文附在下面:

Element is not currently visible

I am using Selenium 2.0b3 Java API with FirefoxDriver. When I fill a form, checkboxes are added to the page depending the forms inputs. I to simulate a click on those checkboxes using selenium. The element are visible and usable in a regular browser but, selenium asserts that the elements are not visible.

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

Can I force selenium to ignore the non-visible state of the elements? How can I force selenium to interact with the non visible element?

  

Selenium determines an element is visible or not by the following criteria (use a DOM inspector to determine what css applies to your element, make sure you look at computed style):

  • visibility != hidden
  • display != none (is also checked against every parent element)
  • opacity != 0 (in rc2 this is no longer checked for clicking an element)
  • height and width are both > 0
  • for an input, the attribute type != hidden

Your element is matching one of those criteria. If you do not have the ability to change the styling of the element, here is how you can forcefully do it with javascript. (going to assume WebDriver since you said Selenium2 API):

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);

But that won't fire a javascript. event, if you depend on the change event for that input you'll have to fire it too (many ways to do that, easiest to use whatever javascript. library is loaded on that page).

3种情况是:估计意思是就是选取元素的时候,可能存在两个相同的,但一次只会用一个,这两个区别就有一个样式的属性是不可见的,这个时候选取元素时要去掉不可见属性,如下例子:

WebElement label = driver.findElement(By.xpath("//

label[text()='User Name:' and not(contains(@style,'display:

none'))]"));

这个源版的这种情况下的解决方案附在下面:

can think of two reasons the element you are attempting to interact

with is invisible. The first reason is that some fields might be

invisible until you fill in other fields. For example, many

registration forms have a submit button which is not visible until the

user has filled in all the required fields. WebDriver is designed to

simulate a human interacting with the web page. Are you filling out

the page exactly the same way a human would? Maybe you filled in all

the fields but your automation is faster than a human. So it tries to

click the submit button before the web page can change it to visible.

You can use things like http://darrellgrainger.blogspot.ca/2012/01/waitforelement.html

to help slow down the automation.

 

The second reason the element might be invisible is you have located

an invisible element rather than the element you thought you wanted.

For example, I worked on a web page which had a radio button for new

user versus sign in. If you clicked new user, the form. for registering

a new user appeared. If you clicked existing user, the form. for

signing in appeared. Both forms existed in the DOM but only one was

visible at a time. Both forms had:

 

 

   <label for="foo29_blah_nix17">User Name:</label>

<input id="foo29_blah_nix17" />

 

 

(the for/id values would be different). So if I used:

 

 

   String username = "darrell";

   WebElement label = driver.findElement(By.xpath("//

label[text()='User Name:']"));

   String inputID = label.getAttribute("for");

   WebElement input = driver.findElement(By.id(inputID));

   input.sendKeys(username);

 

 

it might find the invisible label. In these cases, I need to use an

xpath which finds the visible label element. If the element is

invisible because style='display: none' then I'd use:

 

 

   WebElement label = driver.findElement(By.xpath("//

label[text()='User Name:' and not(contains(@style,'display:

none'))]"));

 

 

You'll have to figure out if you have problem #1 or #2. If you have

problem #2, you will have to figure out the exact solution. My

solution is just one of many possible examples and might not be

exactly your problem.

4种情况:一般是编写脚本流程没有严格按照手工的步骤来进行,导致选取到非流程中的不可显示元素,进行操作,以致报上面提到的异常,这种情况在第3种情况的首段有所描述。

6.无法定位唯一的xpath

 

分享到:
评论

相关推荐

    WebDriver-xpath和WebDriver-Css学习

    7. **异常处理**:学习如何处理找不到元素、元素不可见等常见异常,编写健壮的测试脚本。 8. **兼容性问题**:理解不同浏览器对XPath和Css的支持情况,特别是在IE和其他现代浏览器之间的差异。 在 WebDriver-xpath....

    selenium webdriver第三版

    5. 等待技术:为了处理页面加载延迟,可以使用隐式等待`implicitly_wait()`和显式等待`WebDriverWait()`来确保元素可见或可交互。 四、高级功能 1. 并行测试:Selenium Grid允许在多台机器上并行执行测试,提高测试...

    Selenium chrome和iE webdriver

    然后,你可以通过WebDriver对象调用各种方法,如打开URL、查找元素、发送键盘事件、点击按钮、填写表单等,实现对网页的自动化测试。 Selenium支持断言和异常处理,确保测试的准确性和稳定性。例如,你可以检查元素...

    Python Webdriver Exceptions Cheat Sheet By 灰蓝.pdf

    这是所有webdriver异常的基类,当出现异常而该异常不属于其他特定异常时,会被抛出。它是所有webdriver异常的基类,用于捕获其他更具体的异常。 2. InvalidSwitchToTargetException 这个异常的父类是...

    WebDriver 自动化测试 selenide.zip

    5. **强健的异常处理**:Selenide抛出的异常信息非常具体,能快速定位失败原因,比如找不到元素或执行了无效的操作。 **Selenide的使用示例** 在Selenide中,你可以这样编写一个简单的测试用例: ```java import ...

    [转载]Selenium2.0之WebDriver学习总结(3).docx

    在测试开始前,我们设置了一个隐式等待时间(30秒),以便WebDriver在找不到特定元素时能够等待一段时间。 在测试方法`test()`中,我们首先打开网易相册的网址。接着,通过CSS选择器定位并清空用户名输入框,然后...

    selenium3.0 webdriver+python3.0实例参考

    Selenium提供了多种方法来操作页面元素,如`click()`用于点击元素,`send_keys()`用于输入文本,`clear()`用于清空输入框,`is_displayed()`检查元素是否可见,`text`属性获取元素的文本内容等。 ### 6. 断言和等待...

    基于Python的selenium操作:判断元素是否存在+判断元素是否可以点击.zip

    请注意,即使元素显示为不可见(如设置`style="display:none"`),`is_displayed()`也可能返回True,因为它只检查元素在CSS样式中的可见性,而不考虑实际的屏幕展示。因此,在某些情况下,可能需要进一步检查元素的...

    Selenium没有这么多元素异常

    "Selenium没有这么多元素异常"通常指的是在使用Selenium进行自动化测试时遇到的一个常见错误:NoSuchElementException。这个异常通常发生在尝试定位并操作一个在页面上不存在的HTML元素时。 Selenium WebDriver提供...

    Selenium:Selenium WebDriver(Basics + Advance + Architect)-WebDriver,TestNG,POI等。

    4. **等待机制**:为了确保元素加载完成,WebDriver 提供了隐式等待和显式等待,以确保在执行下一步操作前元素已经可见或可交互。 **Selenium WebDriver 高级特性** 1. **并行测试**:利用 TestNG 等测试框架,...

    chromedriver-win64_125.0.6422.76.zip

    - ChromeDriver默认以头可见模式运行,若需无头模式(隐藏浏览器窗口),可以在创建Webdriver时设置参数: ```python options = webdriver.ChromeOptions() options.add_argument('--headless') driver = ...

    Ruby下WebDriver的相关操作指南

    这种方式更加灵活且精确,适用于处理页面元素加载速度不确定的情况。 ```ruby wait = Selenium::WebDriver::Wait.new(:timeout =&gt; 3) # 设置超时时间为 3 秒 wait.until { driver.find_element(:id =&gt; "cheese")....

    selenium-webdriver-java-course:我的免费Selenium WebDriver for Java教程的源代码-java source code

    Selenium WebDriver提供了各种断言方法,如`assertEquals()`,用于检查页面状态、元素属性等是否正确。 6. **处理动态元素和异步加载** 当网页元素是动态加载或者页面加载时间较长时,源代码将展示如何等待元素...

    SeleniumGinoTesting:在这里我将通过示例学习如何使用 Selenium Webdriver

    - 在编写Selenium测试时,应该适当地捕获和处理可能出现的异常,如找不到元素、超时等,以提高测试的健壮性。 8. **测试报告** - 可以使用TestNG或Allure等工具生成详细的测试报告,便于分析测试结果。 9. **...

    selenium-2.0dev3.tar.gz

    6. 验证元素状态:Selenium还提供了检查元素属性、可见性等方法,如`element.is_displayed()`用于判断元素是否可见。 7. 模拟键盘和鼠标事件:通过ActionChains类,我们可以模拟复杂的用户操作,如拖放、右键点击等...

    基于Selenium 2的自动化测试-第3章1

    Selenium提供了`WebDriverWait`和`ExpectedConditions`类,它们可以帮助我们在元素可见或可交互之前等待一定的时间。这样可以避免因为页面未完全加载就执行操作而导致的测试失败。 此外,为了提高测试效率,...

    python+selenium 定位到元素,无法点击的解决方法

    这可能是由于元素被遮挡、页面加载不完全或元素处于不可见状态等原因导致的。本文将详细介绍几种常见的解决方法,并通过具体示例来帮助读者更好地理解和应用这些技巧。 #### 报错示例分析 在给定的内容中,出现了...

    projetoCursoSeleniumJava:Selenium WebDriver实用程序教程

    - 显式等待:使用`WebDriverWait`等待特定条件满足,例如元素可见:`new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(by));` - 隐式等待:`driver.manage().timeouts()....

    EjemplosJava:带有 Selenium WebDriver 的不同 Java 代码示例的项目

    5. **元素操作**:一旦定位到元素,可以执行各种操作,如`click()`(点击)、`sendKeys()`(输入文本)、`getText()`(获取元素文本)、`isDisplayed()`(检查是否可见)等。这些操作在自动化测试中非常常见。 6. *...

    selenium3.141.59

    8. **异常处理**:在编写Selenium测试脚本时,需要处理各种可能出现的异常,例如找不到元素、元素不可见、网络错误等。通过捕获和处理这些异常,可以确保测试的稳定性和可靠性。 9. **报告生成**:为了跟踪和分析...

Global site tag (gtag.js) - Google Analytics