我的一个自动化案例已被阻止超过1周,有一个延迟加载的iframe(点击一个链接将这个iframe插入DOM),我的代码如下:
driver.get("my url");
driver.findElement(By.linkText('REGISTER')).click();
driver.wait(function() {
console.log("WAITING FOR EXTERNAL IFRAME");
return driver.findElement(By.css("div#main-container > iframe")).isDisplayed();
}, 8000, "WAIT TIMEOUT!!!!");
driver.switchTo().frame(1); // The iframe has no id and I have no control
// Manipulating in the iframe
每当我手动执行上述操作时,我在点击“注册”按钮后100%确定,页面上总共有两个iframe,即如果我document.getElementsByTagName("iframe")
,我可以获得两个iframe!但是在自动化运行期间,它总是失败,我真的不知道为什么,更重要的是,我确实看到了protractor和webdriverjs的调试技巧,但是,我没想到在REPL中进行DOM查询的好方法,都是因为webdriverjs的承诺控制流程,所有经验丰富的调试技巧都非常受欢迎!!
答案 0 :(得分:0)
您可以使用三种方法处理iFrame:
driver.switchTo().frame(1)
; driver.switchTo().default
; - 如果未提供其ID,它将切换到默认的iframe driver.switchTo().index(0)
; - 它将切换到默认的第一个索引答案 1 :(得分:0)
更新:iframe在HTML中有2个空格:在iframe中,在iframe中,在iframe外。在iframe中,有一个子文档,子头,子正文。当我们有一个或多个iframe时,我们想要在iframe中做smt,我们可以:使用Element(广泛使用)或using Index
driver = browser.driver;
var iframeElement = element(by.css('path_to_iframe');
browser.switchTo().frame(iframeElement.getWebElement());
driver.findElement(by.tagName('body')).click();
driver.findElement(by.tagName('body')).sendKeys(string);
browser.switchTo()。frame(0);
browser.switchTo()。frame(1);
使用iframe进行的每一项操作都需要退出iframe。您需要:
browser.switchTo().defaultContent();
答案 2 :(得分:-1)
我在Selenium-java工作。以下代码对我来说非常合适。
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
driver.get("https://developer.autodesk.com/");
driver.findElement(By.id("btn_oxygen_registration")).click();
WebElement iframe = driver.findElement(By.xpath("//iframe[contains(@src,'https://accounts.autodesk.com/register')]"));
driver.switchTo().frame(iframe);
driver.findElement(By.id("firstname_str")).sendKeys("EnterUsername");
如果这有助于您,请告诉我。