关闭

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

发表于:2023-12-05 09:20

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

 作者:苍煜    来源:CSDN

  11:日期控件操作
  对于页面中出现时间控件选择时,一般分为两种:
  (1)控件没有限制手动填写的,我们直接使用 sendKeys() 方法进行赋值即可。
  Copydriver.findElement(By).sendKeys("2020-03-30");
  (2)控件限制了手动输入的,只能通过点击控件时间进行输入的,我们就需要使用 js 脚本进行操作了。
  Copy// 获取js执行器
  JavaScriptExecutor js = (JavaScriptExecutor)driver;
  // 对时间输入框进入赋值
  String script = "document.getElementById('xxx').value='2020-03-30';";
  // 执行
  js.executeScript(script);
  注:需要注意的是,不管使用哪种方式进行时间的赋值,一点要注意输入时间的格式是否符合系统的要求;
  12:文件上传
  对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传。
  创建upfile.html文件,代码如下:
  接下来通过sendKeys()方法来实现文件上传。
  import java.io.File;
  import org.openqa.selenium.By;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.chrome.ChromeDriver;
  public class UpFileDemo {
    public static void main(String[] args) throws InterruptedException {
      WebDriver driver = new ChromeDriver();
      File file = new File("./HTMLFile/upfile.html");
      String filePath = file.getAbsolutePath();
      driver.get(filePath);
      //定位上传按钮, 添加本地文件
      driver.findElement(By.name("file")).sendKeys("D:\\upload_file.txt");
      Thread.sleep(5000);
      driver.quit();
    }
  }
  13:调用js
  虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了executeScript()方法来执行JavaScript代码。
  用于调整浏览器滚动条位置的JavaScript代码如下:
  <!-- window.scrollTo(左边距,上边距); -->
  window.scrollTo(0,450);
  window.scrollTo() 方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下:
  import org.openqa.selenium.By;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.Dimension;
  import org.openqa.selenium.chrome.ChromeDriver;
  import org.openqa.selenium.JavascriptExecutor;
  public class JSDemo {
    public static void main(String[] args) throws InterruptedException{
      WebDriver driver = new ChromeDriver();
      //设置浏览器窗口大小
      driver.manage().window().setSize(new Dimension(700, 600));
      driver.get("https://www.baidu.com");
      //进行百度搜索
      driver.findElement(By.id("kw")).sendKeys("webdriver api");
      driver.findElement(By.id("su")).click();
      Thread.sleep(2000);
      //将页面滚动条拖到底部
      ((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");
      Thread.sleep(3000);
      driver.quit();
    }
  }
  通过浏览器打开百度进行搜索,并且提前通过 window().setSize() 方法将浏览器窗口设置为固定宽高显示,目的是让窗口出现水平和垂直滚动条。然后通过 executeScript() 方法执行JavaScripts代码来移动滚动条的位置。
  将滚动条滚动到某个区域后停止(页面元素全部加载完成),如下:
  //滚动到某一区域
  //scrollIntoView(0);  让元素滚动到可视区域的最下方
  //scrollIntoView();  让元素滚动到可视区域的最上方
  //JavascriptExecutor javascriptExecutor = (JavascriptExecutor)BrowserUtil.driver;
  //javascriptExecutor.executeScript("document.getElementById('index_ads').scrollIntoView(0);");
  //JavaScript的参数传递-selenium和js的交互
  //1、先去找到这个元素
  WebElement webElement = driver.findElement(By.xpath("element"));
  //2、找到的元素作为参数传入到Js代码中
  JavascriptExecutor javascriptExecutor = (JavascriptExecutor)driver;
  javascriptExecutor.executeScript("arguments[0].scrollIntoView(0)",webElement);
  页面元素是通过懒加载方式,需要一直进行滚动的
  /**
  * 滑动列表找元素并且进行点击(懒加载)
  * @param selectedText  选中元素文本
  * @param by  正在加载类似元素的定位表达式
  */
  public static void clickElementInList(String selectedText, By by) {
      // 滑动之前的页面源代码信息
      String beforeSource = "";
      // 滑动之后的页面源代码信息
      String afterSource = "";
      // 循环条件
      // 1、找到了元素,跳出循环
      // 2、如果没有找到元素???怎么跳出循环
      while (true) {
          WebElement webElement = driver.findElement(by);
          // 获取页面源代码
          beforeSource = driver.getPageSource();
          // 获取js执行器
          JavascriptExecutor javascriptExecutor = (JavascriptExecutor)driver;
          // 执行js
          javascriptExecutor.executeScript("arguments[0].scrollIntoView(0);", webElement);
          
          // 如果当前页面有想要的元素,怎么判断是否有??--getPageSource
          if (driver.getPageSource().contains(selectedText)) {
              driver.findElement(By.linkText(selectedText)).click();
              // 找到元素退出循环,不再滚动。
              break;
          }
          afterSource = driver.getPageSource();
          // 页面元素没有变化---滑动到了最底部
          if (afterSource.equals(beforeSource)) {
              // 到达底部,退出。
              break;
          }
      }
  }
  Selenium 常见问题
  1.css选择器和xpath选择器你觉得哪个更好?
  答:css选择器效率更高
  2.quit 和 close的区别
  quit 关闭了整个浏览器,close只是关闭了当前的页面;
  quit会清空缓存,close则不会
  3:在springboot中Selenium 版本变为了3.141.59
  在maven中查看依赖:
  分析原因:
  在引用的spring-boot-starter-parent -> spring-boot-dependencies的pom文件依赖中看到:
  看来是spring-boot-dependencies的版本覆盖了我们的版本,那么让自己的坐标覆盖默认的坐标。
  改动后,发现正常了:
  4:使用edge驱动报错
  应该增加EdgeOptions配置
   public static void main(String[] args) {
          //引入eage驱动
          System.setProperty("webdriver.edge.driver", "D:\\driver\\msedgedriver.exe");
          EdgeOptions options = new EdgeOptions();
  //        //允许所有请求
          options.addArguments("--remote-allow-origins=*");
          EdgeDriver driver = new EdgeDriver(options);
  //        EdgeDriver driver = new EdgeDriver();
          //打开网页
          driver.get("http://www.baidu.com");
          //输入框中输入搜索词
          driver.findElement(By.id("kw")).sendKeys("java");
          //点击百度一下按钮
          driver.findElement(By.id("su")).click();
          //获取元素文本信息
          String data = driver.findElement(By.className("s_tab_inner_81iSw")).getText();
          System.out.println(data);
      }
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号