我怎么能避免“元素目前不可见,因此可能无法与Selenium Webdriver进行交互

时间:2012-05-17 18:35:40

标签: selenium webdriver selenium-webdriver

使用selenium webdriver 2.210 + JAVA进行测试。我有一个示例代码,用于选择gmail中的所有邮件。但是当我尝试放置时,代码会抛出“元素当前不可见,因此可能无法与”进行交互通过webdriver获取URL后延迟5秒。是否可以使此代码与延迟一起工作?

    driver.get("https://mail.google.com/mail/u/0/?shva=1#all");
        delay(5);  ////*......Working fine without this...........*////
    driver.switchTo().frame(driver.findElement(By.id("canvas_frame")));
driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']")).click();

提前致谢

11 个答案:

答案 0 :(得分:18)

你确定你正在看正确的元素吗?我遇到了类似的问题,结果发现页面上有两个相似的元素,一个是可见的,另一个不是。 FindElement函数返回了一个不可见的函数。

我通过使用FindElements而不是FindElement解决了这个问题,然后使用Linq来提取可见的那个。

答案 1 :(得分:5)

以下是您可以采取的解决问题的摘要(Protractor / Javascript中的示例):

  • maximize the browser window(在Chrome + Mac上,目前为have to do it differently):

    browser.driver.manage().window().maximize();
    
  • 验证没有其他元素与定位器匹配。如果存在另一个与实际上不可见的定位器相匹配的元素,则可能会出现此错误。

  • 等待element to be clickable

    var EC = protractor.ExpectedConditions,
        elm = element(by.id("myid"));
    
    browser.wait(EC.elementToBeClickable(elm), 5000);
    
  • 元素的
  • scroll into view

    var elm = element(by.id("myid"));
    browser.executeScript("arguments[0].scrollIntoView();", elm);
    
  • 点击via javascript

    var elm = element(by.id("myid"));
    browser.executeScript("arguments[0].click();", elm);
    
  • 移至元素,然后点击"浏览器操作":

    var elm = element(by.id("myid"));
    browser.actions()
        .mouseMove(elm)
        .click()
        .perform();
    

答案 2 :(得分:3)

或者,您可以使用Selenium中提供的JavascriptExecutor类。执行此操作后,您可以执行任何JavaScript来操作网页上的DOM。

Ref :: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.html

答案 3 :(得分:1)

我不确定,但是每个watir-webdriver元素都有 - (Object)wait_until_present(timeout = 30)方法。

如果此步骤是可选的,则应检查可见性:

element = driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']"));

if (element.isDisplayed()) {
  element.click();
}

请注意,我不是java大师,上面的代码没有经过测试。试一试。

答案 4 :(得分:1)

Selenium不会与隐藏或未向用户显示的Web元素进行交互。在这种情况下,用户点击与div元素或类似的东西进行交互并不罕见,这反过来会触发实际按钮,这是为了视觉目的而隐藏的。我建议在页面上的firefox中运行selenium IDE中的步骤。查看在“隐藏”元素上执行单击时是否触发了多个事件。如果事实上触发了多个事件,请按照WebDriver代码进行操作。

答案 5 :(得分:0)

尝试将selenium webdriver降级为2.20.0。

我在ruby gem 2.21.0和2.21.2中遇到了类似的错误。

在我的情况下,如果通过.Ajax调用将按钮添加到页面,则Web驱动程序始终返回button.visible? = false

我的测试以前工作的时间较长,没有任何相关内容发生变化。 所以我认为这是当前版本的webdriver中的一个错误。

答案 6 :(得分:0)

如果您的应用程序使用jQuery,您可以使用Javascript进行点击。我创建了这个简单的帮助器,用于单击WebDriver拒绝查找的元素:

public static void jqClick(String selector, JavascriptExecutor driver) {
    driver.executeScript("$('" + selector + "').click()");
}

作为“驱动程序”,您可以使用,例如org.openqa.selenium.firefox.FirefoxDriver

这是唯一对我有用的解决方案。

答案 7 :(得分:0)

在我的情况下(在C#中从Selenium WebDriver调用PhantomJSDriver)我必须将窗口大小设置得足够大,以使元素可见:

driver.Manage().Window.Size = new Size(1000, 800);

我发现解决这些问题的解决方法: https://github.com/ariya/phantomjs/issues/11637

答案 8 :(得分:0)

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');");

driver.findElement(By.id("id")).click();

通过更改元素的可见性,您可以执行操作。 你可以点击selenium或使用JavascriptExecutor

答案 9 :(得分:0)

PhantomJS 用户应该关注最大化窗口答案。即使屏幕截图显示它完全可见,也很有可能认为javascripted对话框在视口之外。由于它清晰可见,一些滚动视图动作不会改变任何东西,所有其他动作也是无用的。 (对于基于WebKit引擎的其他浏览器也是如此,例如在MacOS Safari和旧Chrome上)

答案 10 :(得分:0)

这很奇怪,但是我必须用Java明确设置浏览器的大小。

  

driver.manage()。window()。setSize(new Dimension(1000,800));