selenium的使用教程
selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。
Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
这里要说一下比较重要的PhantomJS,PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持,其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及无界面测试
简单来说:selenium就是一个基于浏览器引擎的浏览器模拟工具,让我们的代码去操作浏览器引擎的运行,从而达到自动化测试的目的,另外selenium在爬虫中可以充当解析异步渲染的页面,比如ajax页面加载,使得我们不需要去分析复杂的页面js运行逻辑或者找寻请求接口的参数模拟,我们只需要启动selenium,等待渲染后,直接选取渲染后的页面进行爬虫处理工作。本篇使用java操作selenium。
1) pom引用 (使用2.41.0是因为本测试用例使用的是webmagic工程中建立的,而webmagic引用的就是2.41.0依赖,为了消除jar包依赖的影响,特此选择一致的版本)
org.seleniumhq.selenium
selenium-java
2.41.0
org.seleniumhq.selenium
selenium-api
2.41.0
2) 驱动安装
Selenium 可以使用多个浏览器驱动,本次只演示Chrome的驱动,Selenium需要我们自己去下载浏览器驱动放入本地目录,在使用是配置system参数,而下载那个版本的驱动也是有严格要求的,下载的驱动必须和本机安装的chrome浏览器版本符合对应关系,否则会报错。
版本对应关系:https://npm.taobao.org/mirrors/chromedriver (比如chrome版本是88.0.4324.xx,那么找到88.0.4324下载即可)
驱动下载后,我们设置到下面这个路径 E:\\drive\\chrome\\chromedriver.exe
3) 基本使用
System.setProperty("webdriver.chrome.driver", "E:\\drive\\chrome\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
System.out.println(webDriver.getTitle());
selenium 的定位方式一共有八种, id、name、class name、tag name、 link text、partial link text、xpath、css selector
我们下面选取几种进行演示
findElement(By.id())
findElement(By.name())
findElement(By.className())
findElement(By.tagName())
findElement(By.linkText())
findElement(By.partialLinkText())
findElement(By.xpath())
findElement(By.cssSelector())
@Test
public void test1() {
// 选中百度一下
System.setProperty("webdriver.chrome.driver", "E:\\drive\\chrome\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
// 1、根据id
WebElement element = webDriver.findElement(By.id("su"));
// 2、根据className
element = webDriver.findElement(By.className("s_btn"));
// 3、根据tagName
element = webDriver.findElement(By.tagName("input")); //
// 4、xpath
element = webDriver.findElement(By.xpath("//*[@id=\"su\"]"));
// 5、css选择
element = webDriver.findElement(By.cssSelector(".s_btn_wr input"));
System.out.println(element.getAttribute("value"));
}
driver.navigate().back();
driver.navigate().forward();
@Test
public void test2() throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "E:\\drive\\chrome\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//get 到百度首页
driver.get("https://www.baidu.com/");
System.out.printf("now accesss %s \n", driver.getCurrentUrl());
Thread.sleep(2000);
//点击“新闻” 链接
driver.findElement(By.linkText("新闻")).click();
System.out.printf("now accesss %s \n", driver.getCurrentUrl());
Thread.sleep(2000);
//执行浏览器后退
driver.navigate().back();
System.out.printf("back to %s \n", driver.getCurrentUrl());
Thread.sleep(2000);
//执行浏览器前面
driver.navigate().forward();
System.out.printf("forward to %s \n", driver.getCurrentUrl());
Thread.sleep(2000);
driver.quit();
}
getWindowHandle(): 获得当前窗口句柄。
getWindowHandles(): 返回的所有窗口的句柄到当前会话。
switchTo().window():切换到新窗口。 // switchTo().frame() 切换ifame
public void test3() throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "E:\\drive\\chrome\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//get 到百度首页
driver.get("https://www.baidu.com/");
System.out.printf("now accesss %s \n", driver.getCurrentUrl());
Thread.sleep(2000);
//点击“新闻” 链接
driver.findElement(By.linkText("新闻")).click();
System.out.printf("now accesss %s \n", driver.getCurrentUrl());
Thread.sleep(2000);
// 显示所有的窗口
showWindowHandle(driver);
// 切换新的窗口
checktoNewWindow(driver);
// String FirstHandle = driver.getWindowHandle();
// for (String winHandle : driver.getWindowHandles()) {
// if (winHandle.equals(FirstHandle)) {
// continue;
// }
// driver.switchTo().window(winHandle);
// System.out.println(driver.getCurrentUrl());
// break;
// }
}
* clear() 清除文本
* sendKeys() 模拟输入
* click() 单机按钮
* submit() 提交表单
public void test4() {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");
WebElement search_text = driver.findElement(By.id("kw"));
WebElement search_button = driver.findElement(By.id("su"));
search_text.sendKeys("Java");
search_text.clear();
sleep(null);
search_text.sendKeys("Selenium");
search_button.click();
// driver.quit();
}
* element.getSize 尺寸
* element.getText 文本
* element.getAttribute 属性
* element.isDisplayed 是否显示
public void test5() {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");
// 获得百度输入框的尺寸
WebElement size = driver.findElement(By.id("kw"));
System.out.println(size.getSize());
// 返回百度页面底部备案信息
WebElement text = driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[2]"));
System.out.println(text.getText());
// 返回元素的属性值, 可以是 id、 name、 type 或元素拥有的其它任意属性
WebElement ty = driver.findElement(By.id("kw"));
System.out.println(ty.getAttribute("type"));
// 返回元素的结果是否可见, 返回结果为 True 或 False
WebElement display = driver.findElement(By.id("kw"));
System.out.println(display.isDisplayed());
driver.quit();
}
查询多个元素,就是上面查找单个元素的driver.findElement改成使用driver.findElements()操作。
public void test7() throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");
WebElement search_text = driver.findElement(By.id("kw"));
search_text.sendKeys("selenium");
search_text.submit();
Thread.sleep(2000);
// 匹配第一页搜索结果的标题, 循环打印
List search_result = driver.findElements(By.xpath("//div/div/h3"));
// 打印元素的个数
System.out.println(search_result.size());
// 循环打印搜索结果的标题
for (WebElement result : search_result) {
System.out.println(result.getText());
}
System.out.println("-------我是分割线---------");
// 打印第n结果的标题
WebElement text = search_result.get(search_result.size() - 10);
System.out.println(text.getText());
driver.quit();
}
* addCookie: 添加cookie
* getCookies: 获取所有cookie
* deleteAllCookies:删除所有cookie
public void test8() {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
Cookie c1 = new Cookie("name", "key-aaaaaaa");
Cookie c2 = new Cookie("value", "value-bbbbbb");
driver.manage().addCookie(c1);
driver.manage().addCookie(c2);
// 获得 cookie
Set coo = driver.manage().getCookies();
System.out.println(coo);
// 删除所有 cookie
// driver.manage().deleteAllCookies();
driver.quit();
}
js调用使用的是driver.executeScript()
public void test9() throws InterruptedException {
WebDriver driver = new ChromeDriver();
// 设置浏览器窗口大小
driver.manage().window().setSize(new Dimension(700, 600));
driver.get("https://www.baidu.com");
// 进行百度搜索
driver.findElement(By.id("kw")).sendKeys("webdriver api");
driver.findElement(By.id("su")).click();
Thread.sleep(2000);
// 将页面滚动条拖到底部450px
((JavascriptExecutor) driver).executeScript("window.scrollTo(0,450);");
Thread.sleep(3000);
//driver.quit();
}
* 1、全局等待:通过driver.manage().timeouts()设置
* pageLoadTimeout 页面加载时间
* implicitlyWait 查找对象时间
* setScriptTimeout 脚本执行时间
* 2、局部等待: 通过new WebDriverWait(driver, 10, 1) 设置WebDriver的包装。
* wait.until(new ExpectedCondition
* @Override
* public WebElement apply(WebDriver text) {
* return text.findElement(By.id("kw"));
* }
* }).sendKeys("selenium");
public void test10() {
WebDriver driver = new ChromeDriver();
//页面加载超时时间设置为 5s
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
//定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//异步脚本的超时时间设置成 3s
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
// .............. 单个对象等待
WebDriverWait wait = new WebDriverWait(driver, 10, 1);
wait.until(new ExpectedCondition() {
@Override
public WebElement apply(WebDriver text) {
return text.findElement(By.id("kw"));
}
}).sendKeys("selenium");
driver.findElement(By.id("su")).click();
}
前面的例子直到,可以通过element.click执行鼠标点击操作,但是更多复杂的鼠标操作就需要使用Actions相关Api
* Api: Actions action = new Actions(drive); action.动作方法(element).perform();
* 动作方法:
* .contextClick() 右击
* .clickAndHold() 悬浮
* .doubleClick() 双击
* .dragAndDrop() 拖动
* .release() 释放
* .perform() 执行存储的所有动作
public void test11() {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");
driver.manage().window().setSize(new Dimension(1568, 600)); // 增大窗口宽度
WebElement search_setting = driver.findElement(By.id("s-usersetting-top"));
Actions action = new Actions(driver);
action.clickAndHold(search_setting).perform(); // 设置按钮悬浮
driver.quit();
}
* Keys 枚举负责提供按键 , 比如Keys.SPACE(空白键)、Keys.BACK_SPACE (退格键)、Keys.ENTER (回车)
* element.sendKeys()方法可以用来模拟键盘输入。
public void test12() throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
WebElement input = driver.findElement(By.id("kw"));
// 输入框输入内容
input.sendKeys("seleniumm");
Thread.sleep(2000);
// 删除多输入的一个 m
input.sendKeys(Keys.BACK_SPACE);
Thread.sleep(2000);
// 输入空格键+“教程”
input.sendKeys(Keys.SPACE);
input.sendKeys("教程");
Thread.sleep(2000);
// ctrl+a 全选输入框内容
input.sendKeys(Keys.CONTROL, "a");
Thread.sleep(2000);
// ctrl+x 剪切输入框内容
input.sendKeys(Keys.CONTROL, "x");
Thread.sleep(2000);
// ctrl+v 粘贴内容到输入框
input.sendKeys(Keys.CONTROL, "v");
Thread.sleep(2000);
// 通过回车键盘来代替点击操作
input.sendKeys(Keys.ENTER);
Thread.sleep(2000);
driver.quit();
}
通过 driver.switchTo().alert() 进行弹框的定位,执行下面的操作。
getText(): 返回 alert/confirm/prompt 中的文字信息。
accept(): 接受现有警告框。
dismiss(): 解散现有警告框。
sendKeys(keysToSend): 发送文本至警告框。
keysToSend: 将文本发送至警告框。
public void test13() throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
driver.manage().window().setSize(new Dimension(1568, 600));
// 打开搜索按钮
driver.findElement(By.id("s-usersetting-top")).click();
driver.findElement(By.linkText("搜索设置")).click();
Thread.sleep(2000);
// 保存设置
driver.findElement(By.className("prefpanelgo")).click();
Thread.sleep(1000);
// 接收弹窗
driver.switchTo().alert().accept();
Thread.sleep(2000);
driver.quit();
}
更多......!!!
static {
System.setProperty("webdriver.chrome.driver", "E:\\drive\\chrome\\chromedriver.exe");
}
/**
* 1、模拟网易邮箱登录
*/
@Test
public void test1() {
String username = "##############";
String password = "#############";
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://mail.163.com");
BaseDemo.sleep(3000l);
WebElement element = webDriver.findElement(By.tagName("iframe"));
webDriver.switchTo().frame(element);
webDriver.findElement(By.name("email")).sendKeys(username);
webDriver.findElement(By.name("password")).clear();
webDriver.findElement(By.name("password")).sendKeys(password);
webDriver.findElement(By.id("dologin")).click();
}
public void test2() {
String username = "##############";
String password = "#############";
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
// 第一步 点击登录按钮
WebElement webElement = webDriver.findElement(By.id("u1")).findElements(By.className("lb")).get(0);
webElement.click();
BaseDemo.sleep(3000l);
// 第二步找到用户名登陆
WebElement webElement2 = webDriver.findElements(By.cssSelector("p.tang-pass-footerBarULogin")).get(0);
webElement2.click();
BaseDemo.sleep(null);
// 第三步填写用户名和密码进行登陆
webDriver.findElement(By.id("TANGRAM__PSP_11__userName")).sendKeys(username);
BaseDemo.sleep(null);
webDriver.findElement(By.id("TANGRAM__PSP_11__password")).sendKeys(password);
BaseDemo.sleep(null);
webDriver.findElement(By.id("TANGRAM__PSP_11__submit")).click();
webDriver.quit();
}