我的问题是我在我尝试处理的页面上有3个已定义的iFrame。它们都命名如下:
<iframe class="col-51" height="560" src="https://attendee.gototraining.com/embed/886b2/catalog/40xxxx bgColor=ffffff" frameborder="0"></iframe>
<iframe class="col-51" height="560" src="https://attendee.gototraining.com/embed/886b2/catalog/37xxxx bgColor=ffffff" frameborder="0"></iframe>
<iframe class="col-51" height="560" src="https://attendee.gototraining.com/embed/886b2/catalog/46xxxx bgColor=ffffff" frameborder="0"></iframe>
我尝试过driver.switchTo.frame命令,但它只看到索引0,我假设是这里列出的第一帧。如果我选择第一帧,我在运行时不会收到错误,但是我仍然看不到帧内的任何元素。我得到&#34;找不到元素&#34;问题。我甚至无法使用位于I make或索引1或2的switchTo选择第2帧或第3帧。
我还尝试制作一个涉及iframe所有标记名的List。我只收到1个结果。再次,我在这里看到3。而且,即使我选择第一个,我仍然无法使用传统方法在框架内看到任何元素。
我在这里缺少什么?
另请注意,由于隐私问题,我已将x用于此途径。
这是捕获如果我选择0以外的其他索引会发生什么:
org.openqa.selenium.NoSuchFrameException: Unable to locate frame: 1
Command duration or timeout: 62 milliseconds
Build info: version: '2.52.0', revision: '4c2593c', time: '2016-02-11 19:03:33'
System info: host: 'DESKTOP-1PV0EPA', ip: '192.168.0.11', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_77'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{applicationCacheEnabled=true, rotatable=false, handlesAlerts=true, databaseEnabled=true, version=46.0.1, platform=WINDOWS, nativeEvents=false, acceptSslCerts=true, webStorageEnabled=true, locationContextEnabled=true, browserName=firefox, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
答案 0 :(得分:0)
您可以使用xpath定位器并通过部分src
链接识别框架:
void switchToIframe(int catalogId)
{
driver.switchTo().defaultContent(); // don't get trapped in iframes
driver.switchTo().frame(
driver.findElement(
By.xpath("//iframe[contains(@src, 'catalog/" + catalogId + "')]"));
}
使用它像:
switchToIframe(40); // frame 1
switchToIframe(36); // frame 2
switchToIframe(46); // frame 3
您可能还需要在切换到帧之前等待帧加载
答案 1 :(得分:0)
我建议尝试通过XPath将iframe解析为WebElements。下面的代码片段会截断测试用例,您需要确定每个iframe的xpath并填充字符串,但我认为这应该很接近。
private static final By FRAME_PATH_1 = By.xpath("");
private static final By FRAME_PATH_2 = By.xpath("");
private static final By FRAME_PATH_3 = By.xpath("");
private void traverseFrames(WebDriver driver) {
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement frame1 = wait.until(ExpectedConditions.presenceOfElementLocated(FRAME_PATH_1));
WebElement frame2 = wait.until(ExpectedConditions.presenceOfElementLocated(FRAME_PATH_2));
WebElement frame3 = wait.until(ExpectedConditions.presenceOfElementLocated(FRAME_PATH_3));
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame1));
System.out.println("in Frame 1");
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame2));
System.out.println("in Frame 2");
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame3));
System.out.println("in Frame 3");
}
如果您期望页面内容发生变化,XPath对于可维护性来说并不是很好,但它可能会让您更接近您正在寻找的内容。我使用Firebug的Firepath扩展来帮助解决xpath。
最好的运气