Webdriverjs /量角器iframe切换不起作用

时间:2014-06-12 09:35:05

标签: javascript selenium-webdriver protractor

我的一个自动化案例已被阻止超过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!但是在自动化运行期间,它总是失败,我真的不知道为什么,更重要的是,我确实看到了protractorwebdriverjs的调试技巧,但是,我没想到在REPL中进行DOM查询的好方法,都是因为webdriverjs的承诺控制流程,所有经验丰富的调试技巧都非常受欢迎!!

3 个答案:

答案 0 :(得分:0)

您可以使用三种方法处理iFrame:

  1. driver.switchTo().frame(1);
  2. driver.switchTo().default; - 如果未提供其ID,它将切换到默认的iframe
  3. driver.switchTo().index(0); - 它将切换到默认的第一个索引

答案 1 :(得分:0)

更新:iframe在HTML中有2个空格:在iframe中,在iframe中,在iframe外。在iframe中,有一个子文档,子头,子正文。当我们有一个或多个iframe时,我们想要在iframe中做smt,我们可以:使用Element(广泛使用)或using Index

  1. 选项1

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);
  1. 选项2 使用第一个iframe:索引为0,第二个iframe索引为1,然后继续...

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");

如果这有助于您,请告诉我。