【问题标题】:Not able to access a webelement which is inside a frame in a new window pop up在弹出的新窗口中无法访问框架内的 web 元素
【发布时间】:2014-07-18 19:06:31
【问题描述】:
    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 名称作为登录名发送一些数据。 在这里,我试图在登录 ID 字段中发送一些值,但是当我单击登录按钮时,会打开一个弹出窗口。当我右键单击弹出窗口时,我得到一个选项,上面写着 THIS FRAME 然后我才知道它是一个框架。我试图通过使用driver.switchTo().frame(wb); 切换到它,其中 wb 具有框架的路径。当我运行代码时,我得到了loginid failsNOSuchElement exception,这意味着webdriver 无法将控件传递给框架。

我该如何解决这个问题?

【问题讨论】:

  • 你能用firebug识别这个框架吗?
  • @Imen 是的,我可以使用 fierbug 识别框架,但不能在同一个窗口中。问题是,一旦我单击登录按钮,就会弹出一个弹出窗口,并且框架位于该弹出窗口中。我可以使用 firebug 识别弹出窗口中的框架
  • 您是否尝试像那样切换到您的框架 driver.switchTo().frame((driver.findElement(By.cssSelector("iframe[id='appli']"))));或 By.xpath(.....)。有 ”。”在“//”之前的 xpath 中尝试擦除它并再次执行脚本。 NoSuchElment 表示您的 xpath 标识有问题

标签: java selenium xpath selenium-webdriver frame


【解决方案1】:

您错过了切换到另一个iframeGB_frame 的地方,您的textbox: username 出现在此父级iframe 中:- GB_frame1

请将以下内容添加到您现有的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 windows,因为它只有一个窗口。您也可以使用id 而不是xpath 来定位iframes

【讨论】:

  • 非常感谢先生。我一直在寻找过去 2 天的解决方案,但没有找到任何东西。正是因为你,代码才开始工作。再次感谢先生。我是 selenium 的初学者,这就是为什么我想问您如何确定框架内有框架。可以分享给我吗?
  • 即使我一开始也不喜欢,因为它们在我们switchTo()frames 的方式上没有问题。如果它不能findElement,你需要检查它是否在多个框架下,不仅仅是检查,如果你错过了什么,还要检查html。
  • 先生,我浏览了 html,但更紧张地进入了 iframe 标签内编写的代码。从现在开始我也会检查一下
  • 要摆脱框架,我需要使用 driver.switchTo().defaultContent();编码一次还是两次?
  • 一次就够了。
【解决方案2】:
 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);

【讨论】:

    【解决方案3】:

    试试下面的代码,它会正常工作..

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多