测试的自动化能力-UI的电脑端

4 阅读1分钟

自动化主要分为三块:

  • UI的电脑端
  • UI的手机端
  • 接口测试

一、先来说说UI的电脑端,主要是selenium的原理和8大定位元素 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包依赖的影响,特此选择一致的版本)

     <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>2.41.0</version>     
     </dependency>
     
     <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-api</artifactId>
         <version>2.41.0</version>
     </dependency>
    

AI写代码 java 运行

  1. 驱动安装

Selenium 可以使用多个浏览器驱动,本次只演示Chrome的驱动,Selenium需要我们自己去下载 浏览器驱动放入本地目录,在使用是配置system参数,而下载那个版本的驱动也是有严格要求的,下载的驱动必须和本机安装的chrome浏览器版本符合对应关系,否则会报错。

版本对应关系:npm.taobao.org/mirrors/chr… (比如chrome版本是88.0.4324.xx,那么找到88.0.4324下载即可)

驱动下载后,我们设置到下面这个路径 E:\drive\chrome\chromedriver.exe

  1. 基本使用

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

AI写代码 java 运行 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"));
	
}

AI写代码 java 运行

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

AI写代码 java 运行

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; // } } AI写代码 java 运行

5、Api操作-常用方法

  • clear() 清除文本
  • sendKeys() 模拟输入
  • click() 单机按钮
  • submit() 提交表单

public void test4() { WebDriver driver = new ChromeDriver(); driver.get("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();
}

AI写代码 java 运行

6、Api操作-元素属性方法 * element.getSize 尺寸 * element.getText 文本 * element.getAttribute 属性 * element.isDisplayed 是否显示

public void test5() { WebDriver driver = new ChromeDriver(); driver.get("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();
}

AI写代码 java 运行

7、Api操作-查询多个元素 查询多个元素,就是上面查找单个元素的driver.findElement改成使用driver.findElements()操作。

public void test7() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("www.baidu.com/");

	WebElement search_text = driver.findElement(By.id("kw"));
	search_text.sendKeys("selenium");
	search_text.submit();
	Thread.sleep(2000);

	// 匹配第一页搜索结果的标题, 循环打印
	List<WebElement> 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();
}

AI写代码 java 运行

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<Cookie> coo = driver.manage().getCookies();
	System.out.println(coo);

	// 删除所有 cookie
	// driver.manage().deleteAllCookies();

	driver.quit();
}

AI写代码 java 运行

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

AI写代码 java 运行

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<WebElement>() {
		@Override
		public WebElement apply(WebDriver text) {
			return text.findElement(By.id("kw"));
		}
	}).sendKeys("selenium");
   
    driver.findElement(By.id("su")).click();
    
}

AI写代码 java 运行

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("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(); } AI写代码 java 运行 12、Api操作-模拟键盘 * Keys 枚举负责提供按键 , 比如Keys.SPACE(空白键)、Keys.BACK_SPACE (退格键)、Keys.ENTER (回车) * element.sendKeys()方法可以用来模拟键盘输入。

public void test12() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("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();
}

AI写代码 java 运行

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