博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
selenium-java的使用教程
阅读量:4074 次
发布时间:2019-05-25

本文共 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。

一、基本Api操作

1 、环境配置

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());

2、Api操作-定位方式

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"));			}

3、Api操作-网页跳转切换

  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();	}

4、Api操作-窗口切换

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;//		}	}

5、Api操作-常用方法

 * 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();	}

6、Api操作-元素属性方法

     * 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();	}

7、Api操作-查询多个元素

查询多个元素,就是上面查找单个元素的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(); }

8、Api操作-cookie操作

     * 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(); }

9、Api操作-js调用

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();	}

10、Api操作-等待设置

     * 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(); }

11、Api操作-鼠标模拟

前面的例子直到,可以通过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();	}

12、Api操作-模拟键盘

     * 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();	}

13、Api操作-警告框处理

      通过 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();	}

 

更多......!!!

 

二、实际案例

1、模拟网易登陆

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();	}

2、模拟百度登陆

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/

你可能感兴趣的文章
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
媒体广告业如何运用云盘提升效率
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>