Selenium本作为测试Web使用的框架,如今用在爬虫的项目上简直无人能敌。它可以使用浏览器像一个真人一样的进行浏览网页。

由于在爬虫和测试领域用的十分多,所以在Python上用Selenium也是十分方便的。

配置环境

首先需要下载浏览器的驱动,各种语言通过Selenium框架直接调用驱动对浏览器进行操作。

https://www.seleniumhq.org/download/ 市面上的所有浏览器官方都为其浏览器编写了WebDriver选择自己需要的版本,WebDriver的版本是否与已安装的浏览器版本对应。

(Python中有一个PhantomJS无界面的Webkit浏览器,虽然不需要驱动用起来很方便,但是自从chrome的headless模式之后它就停止更新了。并且在我使用的情况下出现了页面解析出错的情况,所以为了减少麻烦还是用WebDriver比较好)

下载后将驱动加入系统环境变量中。

引入/安装Selenium库

#python
pip3 install selenium
//Maven 引入
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
</dependency>
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>

上手Selenium

第一步打开网页

WebDriver driver = new ChromeDriver(); // 载入WebDriver
driver.get("https://baidu.com"); // 打开浏览器
driver.quit(); // 退出

这3行代码就能够成功的唤起Chrome浏览器并打开摆渡。报错?正常操作,在Java下需要以headless模式运行,目前还不知道为啥。

添加启动参数

所以需要加入Chrome启动参数。

ChromeOptions options = new ChromeOptions(); // 创建Chrome启动参数,其他浏览器也有对应的Options对象
options.addArguments("--headless"); // 无窗口模式
options.addArguments("--disable-infobars"); // 禁言消息条(就上面经常一条黄色的那个)
options.addArguments("--disable-extensions"); // 禁用插件
options.addArguments("--disable-gpu"); // 禁用GPU
options.addArguments("--no-sandbox"); // 禁用沙盒模式否则会报错
options.addArguments("--disable-dev-shm-usage"); 
options.addArguments("--hide-scrollbars"); // 隐藏滚动条
WebDriver driver = new ChromeDriver(options); // 载入WebDriver
driver.get("https://baidu.com"); // 打开浏览器
driver.quit(); // 退出

如果以上的代码没有运行错误的提示,那么就说明成功。

但是没有打开浏览器我们咋知道做了啥啊!

所以,在Python并没有这个问题。所以前期的调整可以先通过Python调好之后再放入Java中,反正Api差不多是一样的。

其他一些小操作

Chrome在打开时默认均为非全屏模式,所以可以调用Api设置窗口大小

// 并非直接传入宽和高,需要使用Dimension对象包装一下
driver.manage().window().setSize(new Dimension(1920,1080));

Selenium提供定位元素操作的方法driver.findElement()driver.findElements()区别在于返回数量

并提供不同的定位方式

方式 Demo
根据Id查找 driver.findElement(By.id(“id”))
根据name查找 driver.findElement(By.name(“name”))
根据链接的全部文本查找 driver.findElement(By.linkText(“linkText”))
根据链接的部分文本查找 driver.findElement(By.partialLinkText(“partialLinkText”))
根据ClassName查找 driver.findElement(By.className(“className”))
根据tagName查找 driver.findElement(By.tagName(“tagName”))
根据xpath查找 driver.findElement(By.xpath(“xpath”))

所以完全可以模拟普通的浏览器操作,例如填写一个表格,并提交

driver.findElement(By.name("firstname")).sendKeys("Lei");//输入字串
driver.findElement(By.name("lastname")).sendKeys("Hou");
driver.findElement(By.id("submit")).click();

而且也可以将当前页面截图并保存下来

File srcFile=((ChromeDriver) driver).getScreenshotAs(OutputType.FILE); // 获取浏览器截图
FileUtils.copyFile(srcFile,new File("d://baidu.png")); //保存图片