Selenium java +selenium 切换 iframe 后,按钮点击无反应

donly · 2017年12月23日 · 最后由 zzx 回复于 2023年05月06日 · 2857 次阅读

问题描述:
页面分成了两部分,右边部分是在一个 iframe 中,使用 driver.switchTo().frame("main-iframe");进行了切换,切换之后按钮点击无报错,但是也没有任何效果。
按照百度的说法,先找到上层对象,再来点击操作这个对象,仍然是毫无反应。但是页面上的一个输入框却获得了光标,似乎是被点击了。
源代码如下:

package com.learn.java;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;

public class NewTest {
    WebDriver driver;
  @Test
  public void f() {
      Boolean flag;
      String total;
      driver.get("xxxxxxx");
      //driver.findElement(By.id("username")).sendKeys("admin");
      driver.findElement(By.xpath("//*[@id = 'username']")).sendKeys("admin");
      //driver.findElement(By.id("password")).sendKeys("admin");
      driver.findElement(By.xpath(".//*[contains(@id,'password')]")).sendKeys("admin");
      driver.findElement(By.id("btn-login")).click();
      try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

      flag = driver.findElement(By.xpath(".//span[.='系统管理']")).isDisplayed();
      System.out.println("flag = "+flag);
      driver.findElement(By.xpath(".//span[.='系统管理']")).click();
      //driver.findElement(By.xpath(".//a[.='用户管理']")).click();
      driver.findElement(By.linkText("用户管理")).click();
      driver.switchTo().frame("main-iframe");
      //下面这个sendkey可以成功的,后面的click全无反应,也不报错。
      //去掉这个sendkeys,后面的按钮点击也没有反应,但是可以看到这个输入框显示出被点击的样子,因为它里面有了光标闪烁。
      //driver.findElement(By.id("searchOrder")).sendKeys("admin");
      try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
      //driver.findElement(By.className("input-group input-search")).click();
      //driver.findElement(By.xpath(".//*/div[. = 'input-group input-search']")).click();

      //driver.findElement(By.xpath(".//*/div[@classname = 'input-group-btn']")).click();

      //driver.findElement(By.xpath("//*/button[@onclick='serchUsersByOrder()']")).click();

      total = driver.findElement(By.className("table-total")).getAttribute("innerHTML");
      System.out.println("查询结果:"+total);
      //尝试先找到父层对象,再找按钮,仍然点击无反应
      driver.findElement(By.className("content-search"));
      driver.findElement(By.linkText("添加")).click();

  }
  @BeforeClass
  public void beforeClass() {
      //System.setProperty("webdriver.firefox.marionette", "..\\tools\\geckodriver.exe");  
      //System.setProperty("webdriver.gecko.driver", ".\\tools\\geckodriver.exe"); 
      driver = new ChromeDriver();  
      //driver = new FirefoxDriver();
      driver.manage().window().maximize();
  }

  @AfterClass
  public void afterClass() {
      //driver.quit();
  }

}

共收到 8 条回复 时间 点赞

请教各位前辈,这种情况应该如何处理呢??

刚刚试了用 js 脚本来点击,竟然可以成功。这是什么原因呢???求解答~~

仅楼主可见
徐健鑫 回复

没有写在外面呢,就是在 sendkeys 下面的哦,只是中间加了一个线程等待语句而已呢。

donly 回复

gettext 看看是否有值判断你的元素定位是否正确。

WebDriver.switchTo().defaultContent(),用这个切换到顶层,在切换到"main-iframe"的 frame 试试,我之前就是这样做的

楼主首先你要确认下是否切入到 iframe
String frameElement="XXXXX";
driver.switchTo().frame(frameElement);
driver.findEletement(By.xpath("XXX")).click
driver.switchTo().defaultContent();

想问问楼主后来发现问题原因了没,我也遇到一样的问题了,按道理说如果 iframe 没进去找元素会报错,实际效果是找元素没报错,点击元素没报错,实际元素没点击,从页面看点击了别的地方,疑似元素所处的 iframe?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册