本文共 12283 字,大约阅读时间需要 40 分钟。
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浏览器版本符合对应关系,否则会报错。
版本对应关系: (比如chrome版本是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() 切换ifamepublic 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); // 匹配第一页搜索结果的标题, 循环打印 Listsearch_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:删除所有cookiepublic 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 Setcoo = 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<WebElement>() { // 持续查询,直到返回不等于null * @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(); }
转载地址:http://truni.baihongyu.com/