弹出窗口中无法访问框架内的webelement

时间:2014-05-29 09:56:21

标签: java selenium xpath selenium-webdriver frame

    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;

    public class Iframe {

    public static void main(String[] args) throws Exception{
    WebDriver driver=new FirefoxDriver();
    WebElement wb;
    try{
    driver.get("http://www.timesjobs.com/");
    driver.manage().window().maximize();
    System.out.println("Old window "+driver.getTitle());
    String old=driver.getWindowHandle();
    driver.findElement(By.xpath("//li[1][@class='bdr-left']/a")).click();
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    for(String newi:driver.getWindowHandles()){
        driver.switchTo().window(newi);}
    System.out.println("New window "+driver.getTitle());
    wb=driver.findElement(By.xpath(".//*[@id='GB_window']/div[2]/iframe"));
    driver.switchTo().frame(wb);
    wb=driver.findElement(By.xpath(".//*[@id='j_username']"));
    wb.click();
    wb.sendKeys("shantanunandan@gmail.com");
    driver.switchTo().defaultContent();
    driver.switchTo().window(old);
    System.out.println("Old window "+driver.getTitle());     
    }//try
    catch(Exception e){
        e.printStackTrace();
        driver.close();
        //driver.quit();
    }//catch
    finally{
        driver.close();
        //driver.quit();
    }//finally
   }//main
 }//class

在上面的代码的帮助下,我试图以webelement名称发送一些数据作为LogIn。 在这里,我尝试在登录ID字段中发送一些值,但是当我点击登录按钮时,会打开一个弹出窗口。当我右键单击弹出窗口时,我得到一个选项,说明这个框架,然后我才知道它是一个框架。我尝试使用driver.switchTo().frame(wb);切换到它,其中wb具有帧的路径。当我运行代码时,NOSuchElement exception获得了loginid fails,这意味着webdriver无法将控件传递给框架。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您错过了更换iframe GB_frametextbox: username您父iframeGB_frame1的位置{ - 1}}: - switchTo()

请将以下内容添加到您现有的frame driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@id='GB_frame1']"))); driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@id='GB_frame']"))); 代码中,如下所示:

switchTo

不需要id个窗口,因为它只有一个窗口。您也可以使用xpath代替iframes来查找{{1}}

答案 1 :(得分:1)

 Maybe there are two frames a frame inside a frame. Check the html document and if you finds so then change the code as necessary

 WebElement webele=driver.findElement(By.xpath("//iframe[@id='GB_frame1']"));
 driver.switchTo().frame(webele);
 webele=driver.findElement(By.xpath("//iframe[@id='GB_frame']"));
 driver.switchTo().frame(weble);

答案 2 :(得分:0)

尝试以下代码,它会正常工作..

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("GB_frame1")));
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("GB_frame")));
driver.findElement(By.id("j_username")).sendKeys("TEST");