找到使用SeleniumWebDriver由javascript创建的元素

找到使用SeleniumWebDriver由javascript创建的元素,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我是Selenium和Java方面的新手,我在一个使用Selenium(Java)的自动化测试项目中工作,今天我遇到了一个关于驱动程序的问题。findElement,我想查找的元素是由javascript创建的,我肯定会使用WebDriverWait等待目标元素出现,即使我使用thread.sleep并等待它几分钟,但webdriver仍然找不到该元素 这是我的问题,在html/js代码中我有一个按钮,单击这个按钮javascript将创建一个div,我需要使用selenium来定位它,以使自动

我是Selenium和Java方面的新手,我在一个使用Selenium(Java)的自动化测试项目中工作,今天我遇到了一个关于驱动程序的问题。findElement,我想查找的元素是由javascript创建的,我肯定会使用WebDriverWait等待目标元素出现,即使我使用thread.sleep并等待它几分钟,但webdriver仍然找不到该元素

这是我的问题,在html/js代码中我有一个按钮,单击这个按钮javascript将创建一个div,我需要使用selenium来定位它,以使自动测试工作

单击按钮后,javascript使div看起来像:

<div id="zm-view-frame" class="fade in"><div class="zm-view-header"><div class="zm-view-back"><a onclick="WFLandingpage.closePreview();" id="zm-view-close" class="button" href="javascript:void(0);"><span>Close</span></a></div><div id="zm-view-button"><a href="javascript:void(0);" onclick="WFLandingpage.showDesktop(this)" class="zm-display-desktop"><span>Desktop</span></a><a href="javascript:void(0);" onclick="WFLandingpage.showTablet(this)" class="zm-display-tablet"><span>Tablet</span></a><a href="javascript:void(0);" onclick="WFLandingpage.showMobile(this)" class="zm-display-phone"><span>Mobile</span></a><a href="javascript:void(0);" onclick="WFLandingpage.rotateView()" class="zm-display-rotate"><span>Rotate</span></a></div></div><iframe id="zm-display-iframe" src="page=mvc_landingpages&amp;act=templatepage&amp;preview=1&amp;templateId=landingpage3" style="padding-top: 63px; margin: 0px auto;" scrolling="yes" width="100%" height="609"></iframe></div>
然后:

Tester.Browser.findElement(By.id("zm-view-frame")).click();
当然,我已经定义了这个。等等:

public WebDriverWait wait = new WebDriverWait(Tester.Browser, 100);
我得到一个等待超时异常

我甚至使用了许多类型的By,比如Xpath、css选择器、类。。。但还是没有运气

我还使用Selenium IDE for firefox获取元素,将其导出到java代码并在编辑器中查看,然后执行相同的操作,但它不再适用于我

我真的被这件事缠住了,你能帮我一下吗

很抱歉我的英语不好,非常感谢

更新-这是我的html结构:

更新-我发现了错误并找到了解决方案

原因:在上述代码之前,我有几行代码要检查iframe是否可用,代码如下:

this.wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(locator));
我不知道代码使驱动程序切换到那个iframe,所以我上面的代码在错误的位置(上下文)查找元素

解决方案:因此我需要返回到defaut上下文(返回到父级),我的代码如下:

Tester.Browser.switchTo().defaultContent();

非常感谢@Naveen提醒我检查该案例:)。

我发现了该漏洞并找到了解决方案

原因:在上面的代码之前,我有几行代码要检查iframe是否可用,代码如下:

this.wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(locator));
我不知道代码使驱动程序切换到那个iframe,所以我上面的代码在错误的位置(上下文)查找元素

解决方案:所以我需要回到defaut上下文(回到父级),我的代码如下:

Tester.Browser.switchTo().defaultContent();

非常感谢@Naveen提醒我检查该案例:)。

我发现了该漏洞并找到了解决方案

原因:在上面的代码之前,我有几行代码要检查iframe是否可用,代码如下:

this.wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(locator));
我不知道代码使驱动程序切换到那个iframe,所以我上面的代码在错误的位置(上下文)查找元素

解决方案:所以我需要回到defaut上下文(回到父级),我的代码如下:

Tester.Browser.switchTo().defaultContent();

非常感谢@Naveen提醒我检查该情况:)。

检查您要查找的元素是否在框架元素内,即您的元素是否是
标记的子元素。如果是,则必须首先切换到框架,然后找到元素。请参考我的回答,了解更多关于切换黑白帧的信息。谢谢@Naveen我已经检查过了,它位于我正在工作的父页面上,我可以在HTML中看到,类定义为
淡入
。您确定该元素显示在网页上吗?或者您需要执行一些操作,如(悬停等)以显示元素?hi@Naveen感谢您指示我检查元素是否保留,经过几次调试后,我找到了原因:该元素位于父元素上,这是真的,但在上面的代码之前,我使用
this.wait.until(ExpectedConditions.FrameToBeavailable和SwitchToIt(locator))
为了检查我的另一个iframe是否可用,我不知道在检查之后它切换到了那个iframe。为了解决这个问题,我使用
Tester.Browser.switchTo().defaultContent()回到父母身边,一切都很好,再次感谢兄弟!!!很好,你解决了这个问题。您可以将其作为答案发布,以便其他社区成员可以从中受益。切换到一个帧后,应始终再次切换到默认帧以查找元素。检查要查找的元素是否位于帧元素内,即,您的元素是否是
标记的子元素。如果是,则必须首先切换到框架,然后找到元素。请参考我的回答,了解更多关于切换黑白帧的信息。谢谢@Naveen我已经检查过了,它位于我正在工作的父页面上,我可以在HTML中看到,类定义为
淡入
。您确定该元素显示在网页上吗?或者您需要执行一些操作,如(悬停等)以显示元素?hi@Naveen感谢您指示我检查元素是否保留,经过几次调试后,我找到了原因:该元素位于父元素上,这是真的,但在上面的代码之前,我使用
this.wait.until(ExpectedConditions.FrameToBeavailable和SwitchToIt(locator))
为了检查我的另一个iframe是否可用,我不知道在检查之后它切换到了那个iframe。为了解决这个问题,我使用
Tester.Browser.switchTo().defaultContent()回到父母身边,一切都很好,再次感谢兄弟!!!很好,你解决了这个问题。您可以将其作为答案发布,以便其他社区成员可以从中受益。一旦切换到一个帧,应始终再次切换到默认帧以查找元素。