java爬虫技术之Selenium爬虫

Selenium爬虫

Selenium是一系列基于Web的自动化工具,提供一套测试函数,用于支持Web自动化测试。函数非常灵活,能够完成界面元素定位、窗口跳转、结果比较。

流程:

selenium 使用教程详解-java版本 – 小葛师兄 – 博客园 (cnblogs.com)

一、操作流程

1. 先去Downloads | Selenium下载工具
2. 在pom文件中引入对应的依赖
3. 下载对应浏览器驱动

Firefox浏览器驱动

Releases · mozilla/geckodriver · GitHub

Chrome浏览器驱动:

ChromeDriver Mirror (taobao.org)

IE浏览器驱动:

selenium-release.storage.googleapis.com/index.html

Edge浏览器驱动:

微软边缘驱动程序 – 微软边缘开发人员 (microsoft.com)

Opera浏览器驱动:

发布 ·歌剧软件/歌剧铬驱动程序 ·GitHub

PhantomJS浏览器驱动:

PhantomJS – 可编写脚本的无头浏览器

注:部分浏览器驱动地址需要梯子。

4. 设置浏览器驱动

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: D:toolsHuanjingVariablechromedriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“D:toolsHuanjingVariablechromedriver”目录添加到Path的值中。

5. 环境变量没设置好可以指定磁盘地址去访问浏览器驱动

二、定位方式

方法 描述 参数 示例
findElement(By.id()) 通过元素的 id 属性值来定位元素 对应的id属性值 findElement(By.id(“kw”))
findElement(By.name()) 通过元素的 name 属性值来定位元素 对应的name值 findElement(By.name(“user”))
findElement(By.className()) 通过元素的 class 名来定位元素 对应的class类名 findElement(By.className(“passworld”))
findElement(By.tagName()) 通过元素的 tag 标签名来定位元素 对应的标签名 findElement(By.tagName(“input”))
findElement(By.linkText()) 通过元素标签对之间的文本信息来定位元素 文本内容 findElement(By.linkText(“登录”))
findElement(By.partialLinkText()) 通过元素标签对之间的部分文本信息来定位元素 部分文本内容 findElement(By.partialLinkText(“百度”))
findElement(By.xpath()) 通过xpath语法来定位元素 xpath表达式 findElement(By.xpath(“//input[@id=‘kw’]”))
findElement(By.cssSelector()) 通过css选择器来定位元素 css元素选择器 findElement(By.cssSelector(“#kw”))

三、Selenium API

1. WebDriver 常用 API

WebDriver 提供了一系列的 API 来和浏览器进行交互

方法 描述
get(String url) 访问目标 url 地址,打开网页
getCurrentUrl() 获取当前页面 url 地址
getTitle() 获取页面标题
getPageSource() 获取页面源代码
close() 关闭浏览器当前打开的窗口
quit() 关闭浏览器所有的窗口
findElement(by) 查找单个元素
findElements(by) 查到元素列表,返回一个集合
getWindowHandle() 获取当前窗口句柄
getWindowHandles() 获取所有窗口的句柄

2. WebElement 常用 API

通过 WebElement 实现与网站页面上元素的交互,这些元素包含文本框、文本域、按钮、单选框、div等,WebElement提供了一系列的方法对这些元素进行操作

click() 对元素进行点击
clear() 清空内容(如文本框内容)
sendKeys(…) 写入内容与模拟按键操作
isDisplayed() 元素是否可见(true:可见,false:不可见)
isEnabled() 元素是否启用
isSelected() 元素是否已选择
getTagName() 获取元素标签名
getAttribute(attributeName) 获取元素对应的属性值
getText() 获取元素文本值(元素可见状态下才能获取到)
submit() 表单提交

四、 元素等待机制

在对元素进行定位时,有时候网页加载时间比较长,元素还没有加载出来,这个时候去查找这个元素的话程序中就会抛出异常,所以我们在编写代码时需要考虑延时问题,在selenium中有几种延时机制可以使用如下:

1.硬性等待

硬性等待就是不管你浏览器元素是否加载完成,都要进行等待设置好的时间,利用 java 语言中的线程类 Thread 中的 sleep 方法,进行强制等待。

如:Thread.sleep(3000) 表示程序执行的线程暂停 3 秒钟。

这种方法在一定的程度上是可以解决元素加载过慢的情况,但是不建议使用该方法,因为一般情况下我们无法判断网页到底需要多长时间加载完成,如果我们设置的时间过长,非常影响效率。

2.隐式等待

隐式等待的理解,就是我们通过代码设置一个等待时间,如果在这个等待时间内,网页加载完成后就执行下一步,否则一直等待到时间截止。

代码表示:

这种方法相对于硬性等待显的会灵活一点,但是隐式等待也有个弊端,因为这个设置是全局的,程序需要等待整个页面加载完成,直到超时,有时候我需要找的那个元素早就加载完成了,只是页面上有个别其他元素加载比较慢,程序还是会一直等待下去。直到所有的元素加载完成在执行下一步。

3.显式等待

显示等待是等待指定元素设置的等待时间,在设置时间内,默认每隔0.5s检测一次当前的页面这个元素是否存在,如果在规定的时间内找到了元素则执行相关操作,如果超过设置时间检测不到则抛出异常。默认抛出异常为:NoSuchElementException。推荐使用显示等待。

代码表示:

具体使用案例:

1.查找元素是否已经加载出来

2.查找元素是否可见

3.查找元素是否可点击

4.自定义方法,重写ExpectedCondition中的apply方法

4. ExpectedConditions类中常用方法

方法 描述
presenceOfElementLocated(By locator) 判断某个元素是否被加到了dom树里,并不代表该元素一定可见;
visibilityOfElementLocated(By locator) 判断某个元素是否可见(代表元素非隐藏,元素的宽和高都不等于0);
elementToBeClickable(By locator) 判断某个元素中是否可见并且是enable的且可点击;
elementToBeSelected(By locator) 判断某个元素是否被选中了,一般用在下拉列表;
alertIsPresent() 判断页面上是否存在alert;
titleIs(String title) 判断当前页面的title是否精确等于预期;
titleContains(String title) 判断当前页面的title是否包含预期字符串;
textToBePresentInElement(By locator, String text) 判断某个元素中的text是否包含了预期的字符串;
textToBePresentInElementValue(By locator, String text) 判断某个元素中的value属性是否包含了预期的字符串;
invisibilityOfElementLocated(By locator) 判断某个元素中是否不存在于dom树或不可见;
frameToBeAvailableAndSwitchToIt(By) 判断iframe可用,并且切换到iframe中

5. 页面加载超时设置

通过TimeOuts 对象进行全局页面加载超时的设置,该设置必须放置get 方法之前。如下代码:

如果百度首页在超过5秒钟没有加载完毕,程序就会抛出异常,如果在 2秒就加载完了,就直接往下执行,如果需要对页面加载时间有要求的,可以用这个设置进行检验。

五、特殊元素操作

1. 弹出框处理(alert、confirm)

操作alert、confirm弹出框,可以通过Alert 对象来进行操作,Alert类包含了确认、取消、输入和获取弹出窗内容。

Alert对应属性和方法:

方法 描述
Alert.getText() 获取弹出框内容。
Alert.accept() 接受弹窗的提示,相当于点击确认按钮。
Alert.dismiss() 取消提示窗。
Alert.sendKeys(String s) 给弹窗输入内容。

简单使用示例:

注:如果弹出框不是 js 原生的 alert 弹窗,我们还是按照原来的获取元素的方法。

2. iframe 切换

有时候我们定位元素的时候,发现怎么都定位不了。 这时候你需要查一查你要定位的元素是否在iframe里面。

什么是iframe/strong>

iframe 就是HTML 中,用于网页嵌套网页的。 一个网页可以嵌套到另一个网页中,可以嵌套很多层。

例如:

main.html

frame.html

来源:南辞灬

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月10日
下一篇 2022年5月10日

相关推荐