2012-05-17 43 views
12

我正在使用硒webdriver 2.210 + JAVA进行测试。我有一个示例代码,用于选择gmail中的所有邮件。但代码会抛出一个“元素当前不可见,所以可能不会与”错误,当我尝试通过webdriver获取URL后放置5秒延迟时发生交互。是否可以使此代码延迟工作?我如何避免“元素目前不可见,因此可能不会与”Selenium Webdriver

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

在此先感谢

+2

您需要尝试了解(并告诉我们)为什么会发生这种情况。在页面上的第一个(!)'// div [@class ='T-Jo-auh']'元素在一段时间后真的不可见吗?当您使用Firebug找到它时,您会看到什么?你可以尝试'List list = driver.findElements(“// div [@class ='T-Jo-auh']”);'然后在列表中查找第一个可见元素,用['isDisplayed )'](http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html#isDisplayed%28%29) –

回答

1

我不知道,但每次的Watir-webdriver的元素具有 - (对象)wait_until_present(超时= 30)的方法。

如果这一步是可选的,你应该检查可见:

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

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

请注意,我不是一个Java大师,和上面的代码并没有进行测试。试一试。

+0

'wait_until_present()'不存在在WebDriver中,但可以[以类似的方式]完成(http://seleniumhq.org/docs/04_webdriver_advanced.html#explicit-and-implicit-waits)。这里的问题是元素IS存在,只是不可见(在这种情况下,WebDriver拒绝与它交互)。另外,你的'visible()'方法被称为'isDisplayed()' –

+0

谢谢你澄清Slanec! 使用JS可见的元素将是一个骗子? :) – GoobeMaster

1

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

0

试着将selenium webdriver降级到2.20.0。

我得到了与红宝石版本2.21.0和2.21.2类似的错误。

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

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

0

如果你的应用程序使用jQuery,你可以使用Javascript来做点击。我创造了这个简单的帮手点击该webdriver的拒绝找到的元素:

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

当“司机”,就可以使用,例如一个org.openqa.selenium.firefox.FirefoxDriver

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

17

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

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

+1

没有人会首先考虑的证据。谢谢 ! :-) –

+1

“我通过使用FindElements而不是FindElements解决了这个问题”。也许一个FindElements应该是别的东西? –

+0

这应该是“FindElements而不是FindElement”:) – Kesty

0

在我的情况(PhantomJSDriver在C#中的硒webdriver的称呼),我不得不将窗口大小设置足够大的元素可见:

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

我通过改变能见度 https://github.com/ariya/phantomjs/issues/11637

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

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

:才发现解决方法通过阅读的问题在这里元素你可以执行你的动作。 您可以用硒或JavascriptExecutor单击

4

这是一个事物的总结可以做,以解决这个问题(在量角器/ 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(); 
    
0

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

相关问题