我是selenium web驱动程序的新手,但到目前为止已成功使用它编写了几个Junit测试。我现在正在进行第三次测试并遇到无法找到元素的问题。我从Selenium收到错误“NoSuchElementException
”。我花了好几个小时尝试了很多选项(见下文)。
简而言之,我测试的产品会转到第三方产品,确切地说是与Google云端存储相关联。提出问题的页面实际上是由Google编写的页面,因此我无法与开发人员交谈以查看是否使用了框架而且我无法从html中看出,但是有一个灰色部分称为“框架代码”,因此可能存在帧? (见下文)。
我确实尝试使用“iframe
”指定driver.switchTo().frame(0);
但这也不起作用。
最后,我正在尝试查找的元素在页面加载时暂时变灰。我尝试了一个隐含的等待,
“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(注意:我要查找的元素在行上用*表示。我也尝试了上面一行中的一些隐藏项目。):
`
<head></head>
<body>
<noscript></noscript>
<!--
framebuster code starts here
-->
<style></style>
<script></script>
<xmp style="display:none"></xmp>
<!--
framebuster code ends here
-->
<div id="ogb"></div>
<div id="third_party_info_container">
<div id="third_party_info" class="section_container" data-section="main">
<div class="column"></div>
<div id="approval_container">
<div class="column">
<div id="connect_container" class="modal-dialog-buttons button_container">
<form id="connect-approve" style="display: inline;" method="POST" action="https://accounts.google.com/o/oauth2/approval?as=32b8da86447…d=none&xsrfsign=APsBz4gAAAAAVLBpqOjvhQOwuPvNvPdcZF53EntxeTvP">
<input id="bgresponse" type="hidden" name="bgresponse"></input>
<input id="_utf8" type="hidden" value="☃" name="_utf8"></input>
<input id="state_wrapper" type="hidden" value="CoYDcmVzcG9uc2VfdHlwZT1jb2RlJmFjY2Vzc190eXBlPW9mZmxpbmUmcmVk…UucmVhZF9vbmx5EhUxMTY5MjAyNTM4Nzc2NTMxNzA1MTQY7seC5-zsnJbqAQ" name="state_wrapper"></input>
<input id="submit_access" type="hidden" value="" name="submit_access"></input>
*<button id="submit_approve_access" class="goog-buttonset-action" tabindex="1" type="submit"></button>
<button id="submit_deny_access" tabindex="2" type="submit"></button>
</form>
<div class="clear"></div>
</div>
</div>
</div>
</div>
</div>
<div style="display:none"></div>
<div id="tooltip_bubble"></div>
<script type="text/javascript"></script>
<iframe src="https://clients5.google.com/pagead/drt/dn/" aria-hidden="true" style="display: none;"></iframe>
</body>
`
答案 0 :(得分:0)
此代码中似乎没有iframe,但我认为你应该尝试
driver.findElement(By.cssSelector("button#submit_approve_access")).click();
这将找到ID为#34; submit_approve_access&#34;的按钮。 如果您正在寻找输入元素,请尝试
driver.findElement(By.cssSelector("input#submit_access")).click();
如果这不起作用,我能想到的最后一件事就是这个
(driver.findElement(By.cssSelector("input#submit_access"))).click();
这些额外括号确保对对象执行.click。它不应该有所作为,但可能会有所不同。
关于灰色元素,您不应使用隐式等待代码。那是在你使用
的时候driver.get("");
尝试:
try{
Thread.sleep(500);
}catch(Exception e){//Use this before you find the element
e.printStackTrace();
}
而不是:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
答案 1 :(得分:0)
我会尝试使用explicit
等待。如果您使用ie
,则另一条信息如果您更新了[KB 3025390](https://code.google.com/p/selenium/issues/detail?id=8302)
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("submit_approve_access")));
driver.findElement(By.id("submit_approve_access")).click();
答案 2 :(得分:0)
在点击任何元素之前,您应该等待该元素的存在,您可以使用以下代码:
WebDriverWait wait = new WebDriverWait(driver, Flow.timeOutLimit);
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id("submit_approve_access")));
driver.findElement(By.id(submit_approve_access)).click();