Selenium WebDriver没有识别元素,尝试了很多选项

时间:2015-01-09 23:45:06

标签: java selenium iframe selenium-webdriver

我是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>

`

3 个答案:

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