当元素实际可见时,org.openqa.selenium.ElementNotVisibleException

时间:2015-03-02 13:28:48

标签: selenium selenium-webdriver

screenshot of the IFrame

Scenarion:点击New按钮后,它将被禁用,然后需要在字段名称文本字段中输入数据。它适用于Mozilla,但不适用于IE。

IE版-8 IEDriver -IEDriverServer_x64_2.44.0

1 个答案:

答案 0 :(得分:0)

尝试使用替代CSS selector方法,因为:

  • CSS选择器的性能远远优于Xpath,并且有很好的文档记录 在Selenium社区
  • Xpath引擎在每个浏览器中都不同,因此制作它们 不一致的
  • IE没有本机xpath引擎,因此selenium注入 它自己的xpath引擎,用于兼容其API。因此,我们失去了 使用WebDriver固有的本机浏览器功能的优势 促进。
  • Xpath往往变得复杂,因此难以阅读 意见但是在某些情况下,你需要使用 xpath,例如,搜索父元素或搜索 元素的文字(我不推荐以后)。

有关效果比较的更多详情,请访问here

开始对webElements进行任何操作后,最好等到整个页面呈现。以下是一些可以帮助您的技巧: 1)waitForPageLoad()方法:

public void waitForPageLoad(WebDriver driver_) {

        Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
        wait.until(new Function<WebDriver, Boolean>() {
            public Boolean apply(WebDriver driver) {

                return String
                        .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                        .equals("complete");
            }
        });
    }

2)fluentWait方法 - 可以动态配置其超时和轮询间隔的Wait接口的实现。

 public WebElement fluentWait(WebDriver driver, final By locator) {
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                        // .pollingEvery(5, TimeUnit.SECONDS)
                .pollingEvery(1, TimeUnit.SECONDS)
                        // .ignoring(NoSuchElementException.class);
                .ignoring(org.openqa.selenium.NoSuchElementException.class);

        WebElement foo = wait.until(
                new Function<WebDriver, WebElement>() {
                    public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                    }
                }
        );
        return foo;
    }

添加这些方法后,您可以使用以下调用:

// css selector of the input field:
String cssSelectorInput="blablabla" 
waitForPageLoad(driver);
WebElement input= fluentWait(driver, By.cssSelector(cssSelectorInput));
input.sendKeys("test name");

..... etc

希望这会对你有所帮助。