有一个需求是:页面上有一批测试数据要删除,一共10万条数据,每页显示20条,一共5000页,手动删除的操作一般是先点击全选本页20条,点击"删除"按钮,再点击弹出"确认"按钮完成一次操作。人工点击太费时费力,本来写了一个js脚本,每隔10秒定时去操作,把脚本放在当前页面的浏览器控制台执行,不一会浏览器就卡死了。这时selenium就派上用场了
所需依赖:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-htmlunit-driver</artifactId>
<version>2.52.0</version>
</dependency>
代码实现逻辑:
// 加载驱动
System.setProperty("webdriver.chrome.driver", "D:/chromedriver/chromedriver.exe");
driver = new ChromeDriver();
// 访问登陆页面
driver.get("这里写登陆页url");
// 跳转到原始登录页
WebElement oldLogBtn=((ChromeDriver) driver).findElementByLinkText("旧版页面登录");
oldLogBtn.click();
// 用户名
WebElement username=((ChromeDriver) driver).findElementById("username");
username.sendKeys("这里写用户名");
// 密码
WebElement password=((ChromeDriver) driver).findElementById("password");
password.sendKeys("这里写密码");
// 记住登录状态
WebElement remember=((ChromeDriver) driver).findElementById("rememberMe");
remember.click();
// 提交登陆
WebElement submit =((ChromeDriver) driver).findElementById("login");
submit.click();
driver.get("这里写抓取页url");
// 当前页面全选框
WebElement checkbox = ((ChromeDriver) driver).findElementById("checkbox");
// 通讯录删除按钮
WebElement delBtn = ((ChromeDriver) driver).findElement(By.xpath("//*[@id=\"content-header\"]/div/button[2]"));
// 删除确认按钮
// WebElement confirmBtn = ((ChromeDriver) driver).findElement(By.cssSelector(".btn.btn-primary.submit "));
WebElement confirmBtn = ((ChromeDriver) driver).findElement(By.xpath("//*[@id=\"del-contacts\"]/div/div[3]/div[1]/button[1]"));
System.out.println("confirmBtn=" + confirmBtn);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
// 全选
checkbox.click();
try {
// 删除
delBtn.click();
Thread.sleep(1000);
// 确认
confirmBtn.click();
} catch (InterruptedException e) {
e.printStackTrace();
}, 2000, 5000);
注意要点:
第一:根据你所使用的浏览器,我这里使用的chrome驱动,当然你也可以使用Firefox或者ie等等驱动,下载地址为
chromedriver.exe驱动下载
,注意驱动版本与电脑上浏览器的版本兼容关系
第二:在找元素的时候,有的时候元素只有一个class属性,而且是多个值,中间还有空格,一般我们在javascript中,通过jQuery这么选取:$(".btn.btn-light"),但是如果在selenium中你通过下面这种方式获取就会报
错
(1)
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"class name","selector":".btn.btn-light"}:
WebElement button = ((ChromeDriver) driver).findElementByClassName(".btn.btn-light");
(2)接下来我把class属性值中的“.”去掉,改用空格替代,保持页面上class属性值的原样,又报新错误
了
org.openqa.selenium.InvalidSelectorException: invalid selector: Compound class names not permitted
:
WebElement delBtn1 = ((ChromeDriver) driver).findElementByClassName("btn btn-light");
这是因为selenium的这个api不支持复合属性
(3)幸好selenium支持css选择器,然后我改成下面的
WebElement confirmBtn2 = ((ChromeDriver) driver).findElement(By.cssSelector(".btn.btn-light"));
这次获取button元素没有出错,但是在调用这个元素的click方法时
报错
org.openqa.selenium.ElementNotVisibleException: element not visible :
网上说这个错误可能是因为元素选错了,也有可能是这个class属性很多元素都有,所以不唯一;也有可能是页面还没渲染出来,要等待一会;还有可能是这是隐藏元素或遮罩层的元素,反正那个博客分析的挺详细的,你可以慢慢排查,我会在文章下面的参考地址贴出那篇博客;文章建议优先根据元素id来获取元素,没有id就使用xpath路径;尽量不要使用class来获取;
第三:有的人可能不会xpath语法,没关系,打开浏览器控制台,在element标签下,选中你要的元素,鼠标右键,在弹出的菜单中选择“copy”---》“copy xpath”,粘贴到程序中完事,如下图:
第四:selenium再智能,也要通过浏览器操作,之所以要下载chromedriver.exe,运行程序时会弹出chrome浏览器,一切就绪后,千万不要用鼠标去操作页面,一旦动了页面,程序功能就失效了
第五:遇到渲染慢的页面,sleep一下
后来发现采用httpclient模拟浏览器处理比上面好用;在你不知道按钮发送的请求连接情况下用上面selenium,知道的话还是httpclient效率高一些
参考地址:https://blog.csdn.net/BerlinLove/article/details/70053808
https://blog.csdn.net/duzilonglove/article/details/78603956
有一个需求是:页面上有一批测试数据要删除,一共10万条数据,每页显示20条,一共5000页,手动删除的操作一般是先点击全选本页20条,点击"删除"按钮,再点击弹出"确认"按钮完成一次操作。人工点击太费时费力,本来写了一个js脚本,每隔10秒定时去操作,把脚本放在当前页面的浏览器控制台执行,不一会浏览器就卡死了。这时selenium就派上用场了 所需依赖:&lt;dependency&...
selenium
简介
selenium
是一个web的自动化测试工具,不少学习功能自动化的同学开始首选
selenium
,相因为它相比QTP有诸多有点:
* 免费,也不用再为破解QTP而大伤脑筋
* 小巧,对于不同的
语言
它只是一个包而已,而QTP需要下载安装1个多G 的程序。
* 这也是最重要的一点,不管你以前更熟悉C、
java
、ruby、python、或都是C# ,你都可以通过
selenium
完成自动化测试,而QTP只支持VBS
* 支持多平台:windows、linux、MAC ,支持多
浏览器
:ie、ff、safari、opera、chrome
* 支持分布式测试用例
Selenium
是一款免费的分布式的自动化测试工具,支持多种开发
语言
,无论是C、
java
、ruby、python、或是C# ,你都可以通过
selenium
完成自动化测试。本文以一个简单的小例子,简述C# 利用
Selenium
进行
浏览器
的
模拟
操作
,仅供学习分享
使用
,如有不足之处,还请指正。
涉及知识点
要实现本例的功能,除了要掌握Html ,
Java
Script,CSS等基础知识,还涉及以下知识点:
log4net:主要用于日志的记录和存储,本例
采用
log4net进行日志记录,便于过程跟踪和
问题
排查,关于log4net的配置和介绍,之前已有说明,本文不做赘述。
Queue:队列
在此记录下,之前也没有遇到过这个
问题
,都是常规的send_keys()方法,
模拟
的ctrl+a 这种组合键
# -*- coding: utf-8 -*-
__Author__ = "xiewm"
__Date__ = "2016/5/19 18:46"from
selenium
import webdriver
from time import sleep
from
selenium
.webdr
1、Exception in thread "main" org.openqa.
selenium
.WebDriverException: Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: XP
Build info: version: '2.16.1', revision:
1.
selenium
介绍
搜到了几种方法:1.urllib2,mechanize,单纯的访问web,不解析其js,css;2.
selenium
,利用
浏览器
,支持js,css等,具体包括打开
浏览器
和不需要打开
浏览器
两种方式,此外还有splinter,将
selenium
进行封装得到更顶层的API。目前仅仅试了一下
selenium
。
selenium
是一种自动化测试工具,用来对web界面进行测试,它...
在上一篇笔记《Ajax数据爬取简介》中我们提到,在爬取动态渲染
页面
的数据时(通常为Ajax),我们可以
使用
AJAX URL分析法和
Selenium
模拟
浏览器
行为两种方法,其中前者已经分析一般思维已叙述,在本节中我们主要介绍如何
使用
Selenium
模拟
浏览器
行为来获取数据。
一、准备工作
在正式介绍
使用
之前,我们需要先安装
selenium
库,安装库的过程和之前一样,我们可以直接
使用
命令’pip ...
报org.openqa.
selenium
.InvalidArgumentException: invalid argument异常
环境:centos7.6 chrome-version:96.0
当我
使用
webDriver.get(url)时,报参数无效的异常;这是因为当我们在linux下访问本地html时,文件路径要用file:///修饰,也就是url:file:///xxxxx.html。
在windows系统下就没有这个情况了
使用
Selenium
来
模拟
登录网站的步骤如下:
1. 安装
Selenium
。要
使用
Selenium
,首先需要将其安装到你的
Java
项目中。可以通过在你的项目的依赖管理工具(例如Maven或Gradle)中添加
Selenium
的依赖来安装
Selenium
。
2. 安装
浏览器
驱动程序。要
使用
Selenium
控制
浏览器
,你需要安装相应的
浏览器
驱动程序。不同的
浏览器
需要
使用
不同的驱动程序。例如,如果你想
使用
Selenium
控制Chrome
浏览器
,你需要安装ChromeDriver。
3. 创建WebDriver对象。
使用
Selenium
控制
浏览器
的核心类是WebDriver。要创建WebDriver对象,需要调用WebDriver的子类之一的构造函数。例如,如果你想
使用
Selenium
控制Chrome
浏览器
,你可以
使用
以下代码来创建ChromeDriver对象:
WebDriver driver = new ChromeDriver();
4. 打开登录
页面
。
使用
WebDriver的get()方法打开登录
页面
。例如,如果你想打开GitHub的登录
页面
,可以
使用
以下代码:
driver.get("https://github.com/login");
5. 查找登录表单。
使用
Selenium
的各种方法来查找登录表单。例如,可以
使用
findElement()方法来查找表单中的单个元素,或者
使用
findElements()方法来查找多个元
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at
Dead_Cicle:
使用HttpClient模拟访问带有嵌套对象参数的接口
风雨诗轩: