51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2022|回复: 1
打印 上一主题 下一主题

使用WebDriver进行网络爬虫

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-29 16:38:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 草帽路飞UU 于 2019-1-29 16:39 编辑

一、简介

WebDriver官方对其描述如下:


Webdriver (Selenium2)是一种用于Web应用程序的自动测试工具,它提供了一套友好的API,Webdriver完全就是一套类库,不依赖于任何测试框架,除了必要的浏览器驱动,不需要启动其他进程或安装其他程序,也不必像Selenium 1那样需要先启动服务。 Selenium 2则是通过原生浏览器支持或者浏览器扩展直接控制浏览器。


个人理解WebDriver作为自动化测试工具,可以直接通过浏览器对页面按照之前设置的程序进行操作,因为是完完全全原生浏览器的操作,所以我们人工可以完成的工作原则上WebDriver都可以帮助我们完成,这就是他强大的地方。

本文介绍如何搭建开发环境,以及我爬取的过程中常用的功能,具体的语法请关注Selenium2的中文教程网


二、搭建开发环境

WebDriver支持多种语言调用API,并且支持多种浏览器。这里我们就选择Java

注意的是,这里我们指的是Webdriver (Selenium2)

Webdriver (Selenium3)搭建开发环境会有不同。

WebDriver搭建需要三个东西配合

selenium的开发包

浏览器驱动

浏览器

这里最最最最最坑的是:这三个东西的版本必须相互匹配!!!!!

因为我一开始搭建的时候就是因为版本问题死活跑不起来,后来在高人的指点下,才终于找到一个都匹配的版本。

所以大家没有特殊需求建议搭建过程严格使用我这三个版本


2.1selenium的开发包

这里我们使用Maven的方式搭建,注意,我们选择的是Selenium2的版本

  1. <dependency>
  2.      <groupId>org.seleniumhq.selenium</groupId>
  3.      <artifactId>selenium-java</artifactId>
  4.      <version>2.53.1</version>
  5. </dependency>
复制代码

2.2浏览器驱动

Selenium2对于火狐浏览器是不需要驱动的,如果使用谷歌等浏览器就需要下载对应版本的驱动。

但是注意Selenium3对于火狐也是需要驱动的。

并且使用火狐会出现某些元素点击不了的BUG,所以在此建议使用谷歌浏览器

这里我们的驱动也使用谷歌浏览器

在代码中这样设置驱动

System.setProperty("webdriver.chrome.driver","D:\\work\\Webdriver\\chromedriver_x64.exe");


2.3浏览器版本

配合驱动的版本,浏览器只需要升级到最新版本就可以

我这里使用的是Google Chrome 版本 61.0.3163.100(正式版本)

如果你的浏览器不是安装在默认路径下,你还需要设置一下浏览器的路径

  1. System.setProperty("webdriver.chrome.bin", "C:\\Program Files (x86)\\Chrome\\chrome.bin");
复制代码

这样我们就搭建完成了开发环境,我们简单跑一个测试应用
我们让程序自动打开浏览器,然后百度Java

  1. System.setProperty("webdriver.chrome.driver","D:\\work\\Webdriver\\chromedriver_x64.exe");
  2.         WebDriver webDriver = new ChromeDriver();
  3.         webDriver.get("http://www.baidu.com");
  4.         webDriver.findElement(By.id("kw")).sendKeys("Java");
  5.         webDriver.findElement(By.id("su")).click();
  6.         try {
  7.             Thread.sleep(3000);
  8.         } catch (InterruptedException e) {
  9.             e.printStackTrace();
  10.         }

  11.         webDriver.quit();
复制代码


三、定位元素

在操作页面的时候,首先要做的就是定位页面上元素的位置。

定位的方式有很多,这里重点介绍3种

id

className

xpath

1.首先使用id是最准确的,速度也是最快的

2.使用className定位不一定准备,因为搜索到可能不止一个元素

3.xpath是辅助定位的利器,使用谷歌等浏览器非常方便的能获得元素的Xpath


在开发工具中像这样找到了这个元素之后,右键-copy-xpath就能获得该元素的xpath://*[@id=”kw”]

  1. Element element = webDriver.findElement(By.id(key));
  2. Element element = webDriver.findElement(By.className(key));
  3. Element element = webDriver.findElement(By.xpath(key));
复制代码
四、模拟点击

模拟点击主要有两种方式:WebDriver提供的API,JS方法操作,同时鼠标悬停等操作同理。



4.1调用API点击
  1. WebElement element = driver.findElement(By.linkText("登录"));
  2. Actions builder = new Actions(driver);
  3. Action mouserOverlogin=builder.moveToElement(element).click().build();
  4. mouserOverlogin.perform();
复制代码

首先先找到元素,然后封装一个动作,然后使用perform把这个动作释放。
或者可以这样简单写:
  1. webDriver.findElement(By.id("su")).click();
复制代码

4.2使用JS点击

有时候使用API在网络状态不好的时候会比较慢,所以使用JS方法模拟点击会更加有效。
WebDriver对象可以转化为一个JS对象,然后使用JS的方法去执行点击操作

  1. JavascriptExecutor javascriptExecutor = (JavascriptExecutor)webDriver;
  2. javascriptExecutor.executeScript("document.getElementById('next-page-top').click();");
复制代码
4.3智能等待

有时候我们想点击某个按钮,但是还没有加载出来我们就去点击会报错。
所以我们就需要等待这个按钮出现再点击。
一种比较笨的办法就是sleep一段时间,但是这种方法不具备通用性。
这里我们就需要使用WebDriver的智能等待了

  1. WebDriverWait wait = new WebDriverWait(webDriver, 10);
  2.             wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("results-per-page-select")));//设置等待
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-18 15:41 , Processed in 0.064828 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表