Java Selenium WebDriver无法识别元素,尝试了许多选项

Java Selenium WebDriver无法识别元素,尝试了许多选项,java,selenium,iframe,selenium-webdriver,Java,Selenium,Iframe,Selenium Webdriver,我是SeleniumWeb驱动程序的新手,但到目前为止,我已经成功地使用它编写了两个Junit测试。我现在正在进行第三次测试,遇到了一个无法找到元素的问题。我从Selenium收到错误“NoTouchElementException”。我花了数小时尝试了许多选择(见下文) 简而言之,我正在测试的产品属于第三方产品,确切地说,它与谷歌云存储相连。给出问题的页面实际上是一个由Google编写的页面,因此我无法与开发人员交谈,以查看是否使用了框架,我无法从html中分辨出来,但是有一个灰色部分称为“f

我是SeleniumWeb驱动程序的新手,但到目前为止,我已经成功地使用它编写了两个Junit测试。我现在正在进行第三次测试,遇到了一个无法找到元素的问题。我从Selenium收到错误“
NoTouchElementException
”。我花了数小时尝试了许多选择(见下文)

简而言之,我正在测试的产品属于第三方产品,确切地说,它与谷歌云存储相连。给出问题的页面实际上是一个由Google编写的页面,因此我无法与开发人员交谈,以查看是否使用了框架,我无法从html中分辨出来,但是有一个灰色部分称为“framebuster代码”,所以可能存在框架?(见下文)

我确实试图通过使用“
driver.switchTo().frame(0);
”来指定存在一个
iframe

但这也不起作用

最后,在加载页面时,我试图查找的元素会暂时变灰。我试着含蓄地等待,
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);

但那没用

任何关于我可能做错什么的建议或更多尝试的建议都将不胜感激。我不能让这打败我。:-)

以下是我尝试过的所有选项。注意,第一个选项来自IDE,它在IDE中运行良好,只是不通过WebDriver

`driver.findElement(By.id("submit_approve_access")).click();
driver.findElement(By.xpath("(//a[contains(text(),'Accept')])")).click();
driver.findElement(By.name("submit_access")).click();
driver.findElement(By.className("goog-buttonset-action")).click();
driver.findElement(By.cssSelector("input[name=submit_name]")).click();
driver.findElement(By.cssSelector("a[class='goog-buttonset-action']")).click();
driver.findElement(By.linkText(“Accept”)).click();
driver.findElement(By.xpath("//a[@class='goog-buttonset-action']")).click();
driver.findElement(By.xpath("//a[text() = ‘Accept]”)).click();
driver.findElement(By.cssSelector("button[type='submit']")).click();
driver.findElement(By.cssSelector("button[tabindex='1']")).click();`
下面是页面中的html(注意:我要查找的元素在这一行上用*表示。我还尝试了上面这一行中的一些隐藏项):

`


*

`

这段代码中似乎没有iFrame,但我认为您应该试试

driver.findElement(By.cssSelector("button#submit_approve_access")).click();
这将找到id为“提交\批准\访问”的按钮。 如果要查找输入元素,请尝试

driver.findElement(By.cssSelector("input#submit_access")).click();
如果这不起作用,我能想到的最后一件事就是

(driver.findElement(By.cssSelector("input#submit_access"))).click();
这些额外的括号确保在对象上执行.click。这不应该有什么不同,但可能会有不同

另外,对于灰显的元素,不应使用隐式等待代码。那是给你用的

driver.get("");
尝试:

而不是:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

我会尝试使用显式等待。如果您使用的是
ie
另一条信息如果您已进行[KB 3025390]更新()


始终在单击任何元素之前,您应该等待该元素的出现,您可以使用以下代码段:

WebDriverWait wait = new WebDriverWait(driver, Flow.timeOutLimit);
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id("submit_approve_access")));          
driver.findElement(By.id(submit_approve_access)).click(); 

您是否尝试过使用
WebDriverWait
进行显式等待?谢谢@alecxe,使用WebDriverWait我得到了一个超时。Selenium就是看不到按钮。尽管有了这些帮助,我还是继续感到困惑。我对硒有了更多的了解。@ColdConfusion,谢谢你的建议。我已经尝试了以上所有方法,但不幸的是它们也不起作用。@ColdConfusion,更具体地说,我得到了“NoTouchElementException”,然后当我使用睡眠时,我得到了一个超时。我现在觉得这个页面有点奇怪,或者与其他页面不同,因为这个页面是通过使用我们产品中的谷歌API调用的。哈,这很奇怪。哦,我只知道这么多。抱歉。无论如何,谢谢你,我从你那里学到了很多关于未来硒测试的知识。:-)谢谢你的建议@Saifur。当使用webdriverwait时,我得到一个java.lang.AssertionError:timeout。Selenium Webdriver只是看不到按钮。然后单击也不会起作用,因为除非执行
javascript
,否则Selenium不会与隐藏元素交互。你能提供完整的stacktrace吗?下面是完整的堆栈跟踪(我不得不拆分它,因为它作为一个注释太大了):
java.lang.AssertionError:org.junit.Assert.fail处超时(Assert.java:88)在ConnectAppsOAuthTest.connectAppsJunitTest(ConnectAppsOAuthTest.java:100)在sun.reflect.NativeMethodAccessorImpl.invoke0处(本机方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)位于sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)位于java.lang.reflect.Method.invoke(Method.java:597)
”位于org.junit.runners.model.FrameworkMethod$1.RunnerveColveCall(FrameworkMethod.java:47)在org.junit.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)在org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:44)在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)在org.junit.internal.runners.RunBefores.RunBefores.evaluate(RunBefores.java:26)上在org.junit.internal.runners.statements.runafter.evaluate(runafter.java:27)在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)在org.junit.runners.BlockJUnit4ClassRunner.java:50在org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)在org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)在org.junit.runners.ParentRunner.runners.ParentRunner.access$000(ParentRunner.java:53)在org.junit.runners.ParentRunner.2.evaluate(ParentRunner.java:229)上位于org.junit.runners.ParentRunner.run(ParentRunner.java:309)`
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("submit_approve_access")));
driver.findElement(By.id("submit_approve_access")).click();
WebDriverWait wait = new WebDriverWait(driver, Flow.timeOutLimit);
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id("submit_approve_access")));          
driver.findElement(By.id(submit_approve_access)).click();