selenium 动态爬取页面使用教程以及使用案例(2)

发表于:2023-12-04 09:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:苍煜    来源:CSDN

  6:控制浏览器操作
  浏览器窗口操作
  WebDriver 给我们提供了一个 Window 对象,专门用于对窗口的设置。
  对象获取方法:
  Window window = driver.manage().window();
  Window 对象的方法有:
  浏览器导航操作
  WebDriver 提供了 Navigation 对象来对浏览器进行导航操作,如:前进、后退、刷新等。
  Navigation 对象获取:
  Navigation navigate = driver.navigate();
  Navigation 对象提供的方法:
  7:弹出框/警告框处理
  操作alert、confirm弹出框,可以通过Alert 对象来进行操作,Alert类包含了确认、取消、输入和获取弹出窗内容。
  Alert对应属性和方法:
  // 首先需要切换到弹出框中,获取Alert对象。
  Alert alert = driver.switchTo().alert();
  // 获取弹窗文本内容
  alert.getText();
  // 点击确定按钮
  alert.accept();
  // 点击取消按钮
  alert.dismiss();
  注:如果弹出框不是 js 原生的 alert 弹窗,我们还是按照原来的获取元素的方法。
  8:iframe 切换/多表单切换
  有时候我们定位元素的时候,发现怎么都定位不了。 这时候你需要查一查你要定位的元素是否在iframe里面。
  什么是iframe?
  iframe 就是HTML 中,用于网页嵌套网页的。 一个网页可以嵌套到另一个网页中,可以嵌套很多层。
  例如:
  main.html
  <html>
  <head>
    <title>FrameTest</title>
  </head>
  <body>
    <div id="id1">this is main page's div!</div>
    <input type="text" id="maininput" />
    <br/>
    <iframe id="frameA" frameborder="0" scrolling="no" style="left:0;position:absolute;" src="frame.html"></iframe>
  </body>
  </html>
  frame.html
  <html>
  <head>
    <title>this is a frame!</title>
  </head>
  <body>
    <div id="div1">this is iframes div,</div>
    <input id="iframeinput"></input>
  </body>
  </html>
  使用selenium 操作浏览器时,如果需要操作iframe中的元素,首先需要切换到对应的内联框架中。
  selenium 给我们提供了三个重载的方法,进行操作iframe;
  // 方法一:通过 iframe的索引值,在页面中的位置
  driver.switchTo().frame(index);
  // 方法二:通过 iframe 的name 或者id
  driver.switchTo().frame(nameOrId);
  // 方法三:通过iframe 对应的webElement        
  driver.switchTo().frame(frameElement);
  代码:
  public static void testIframe(WebDriver driver){
      // 在 主窗口的时候
      driver.findElement(By.id("maininput")).sendKeys("main input");
      // 此时 没有进入到iframe, 以下语句会报错
      //driver.findElement(By.id("iframeinput")).sendKeys("iframe input");
      driver.switchTo().frame("frameA");
      driver.findElement(By.id("iframeinput")).sendKeys("iframe input");
      // 此时没有在主窗口,下面语句会报错
      //driver.findElement(By.id("maininput")).sendKeys("main input");
      // 回到主窗口
      driver.switchTo().defaultContent();
      driver.findElement(By.id("maininput")).sendKeys("main input"); 
  }
  注:如果已经切换进入了其中的一个 iframe 中,再想对 iframe 外的元素进行操作,需要切换回到默认的页面中,否则会找不到元素。
  // 切换到默认内容页面
  driver.switchTo().defaultContent();
  9:浏览器窗口的切换/多窗口切换
  有时候后在操作浏览器,可能打开了一个新的窗口,这个时候如果要对新窗口的元素进行操作,需要切换到新窗口中去,怎么去切换呢?在 selenium 中有个叫句柄的概念。
  什么是句柄,简单理解就是浏览器窗口的一个标识,浏览器打开的每个窗口都有唯一的一个标识,也就是句柄,我们可以通过句柄来进行窗口之间的切换,从而来达到我们操作不同窗口的元素。
  WebDriver 中提供了两个 API 来获取窗口的相关句柄:
  // 获取当前窗口的句柄
  String handle = driver.getWindowHandle();
  // 获取所有窗口的句柄,返回一个集合
  Set<String> handles = driver.getWindowHandles();
  获取到句柄后,通过对应的方法进行切换:
  // 切换到窗口
  driver.switchTo.windwo(String handle);
  示例代码:
  /**
  * 切换窗口的方法
  * 通过传入一个标题来找到我们需要的窗口。
  * @param title 窗口的标题
  */
  public void switchWindow(String title){
      Set<String> handles = driver.getWindowHandles();
      // 切换窗口的方式--循环遍历handles集合
      for (String handle : handles) {
          //判断是哪一个页面的句柄??--根据什么来判断???title
          if(driver.getTitle().equals(title)){
          break;
      }else{
          //切换窗口--根据窗口标识来切换
          driver.switchTo().window(handle);
      }
  }
  10:select 下拉框处理
  如果一个页面元素是一个下拉框(select),对应下拉框的操作,selenium有专门的类 Select 进行处理。其中包含了单选和多选下拉框的各种操作,如获得所有的选项、选择某一项、取消选中某一项、是否是多选下拉框等。
  Select类常用的一些方法:
  示例代码:
   // 创建驱动
   WebDriver driver = new ChromeDriver();
   // 打开2345网站
   driver.get("https://www.2345.com");
   // 切换城市
   driver.findElement(By.linkText("切换")).click();
   // 切换到iframe内联框架中
   driver.switchTo().frame("city_set_ifr");
   // 定位到省份下拉框
   WebElement province = driver.findElement(By.id("province"));
   province.click();
   // 创建Select对象
   Select select = new Select(province);
   // 根据文本来获取下拉值
   select.selectByVisibleText("B 北京");
   driver.quit();
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号