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进行处理,非常感谢!