selenium-java的使用教程

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浏览器版本符合对应关系,否则会报错。

版本对应关系: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());

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() { // 持续查询,直到返回不等于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();
	}

 

你可能感兴趣的:(爬虫,selenium-java,selenium,webmagic,爬虫)