15

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

    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();

提前致谢

4

11 回答 11

20

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

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

于 2013-04-23T05:59:39.053 回答
6

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

  • 最大化浏览器窗口(在 Chrome+Mac 上,目前您必须以不同的方式进行操作):

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

  • 等待元素可点击

    var EC = protractor.ExpectedConditions,
        elm = element(by.id("myid"));
    
    browser.wait(EC.elementToBeClickable(elm), 5000);
    
  • 滚动到元素的视图:

    var elm = element(by.id("myid"));
    browser.executeScript("arguments[0].scrollIntoView();", elm);
    
  • 通过 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();
    
于 2016-04-11T13:33:30.763 回答
3

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

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

于 2013-11-06T14:20:11.143 回答
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 大师,上面的代码没有经过测试。试试看。

于 2012-05-17T19:00:25.110 回答
1

Selenium 不会与隐藏或不向用户显示的 WebElement 交互。在这种情况下,用户点击与 div 元素或类似的东西进行交互的情况并不少见,这反过来又会触发实际的按钮,该按钮出于视觉目的而被隐藏。我建议在您的页面上运行 Firefox 中的 selenium IDE 中的步骤。查看当您单击“隐藏”元素时是否触发了多个事件。如果实际上触发了多个事件,请在您的 WebDriver 代码中遵循。

于 2012-05-17T19:42:09.443 回答
0

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

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

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

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

于 2013-02-20T12:22:52.387 回答
0

尝试将 selenium webdriver 降级到 2.20.0。

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

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

我的测试以前工作了更长的时间,并且没有任何相关的改变。所以我认为这是当前版本的 webdriver 中的一个错误。

于 2012-05-29T12:26:17.820 回答
0
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');");

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

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

于 2016-02-04T09:17:44.350 回答
0

在我的情况下(在 c# 中从 Selenium WebDriver 调用 PhantomJSDriver)我必须将 Window Size 设置为足够大以使元素可见:

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

我发现解决方法在这里阅读了这些问题: https ://github.com/ariya/phantomjs/issues/11637

于 2015-08-06T01:51:17.470 回答
0

PhantomJS用户应该注意最大化窗口的答案。即使屏幕截图显示它完全可见,javascript 对话框也很有可能被认为位于视口之外。由于它清晰可见,因此某些滚动查看操作不会改变任何内容,并且所有其他操作也无用。(其他基于 WebKit 引擎的浏览器也是如此,例如 MacOS Safari 和旧版 Chrome)

于 2016-04-13T18:47:08.463 回答
0

它很奇怪,但我必须在 Java 中明确设置浏览器大小。

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

于 2018-11-19T12:51:22.407 回答