使用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();
提前致谢
答案 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();
验证没有其他元素与定位器匹配。如果存在另一个与实际上不可见的定位器相匹配的元素,则可能会出现此错误。
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);
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));