Java中使用Selenium (1)
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")); //保存图片