(五)PC自动化测试框架之自定义框架介绍(二)--function篇(二)(java)

上一篇讲了另外三个文件里的方法(与驱动无关),下面来详细讲解一下,我们最最主要的几个方法(依赖驱动)。

UserFunction

首先声明几个变量,下面会用到。

public class UserFunction {
	public static WebDriver dr;
	public static String Text;
	public static String title;
	public static String objtext;
	static String url;
  • driver
    将driver与公共方法放一起,可以共用一个driver,这个方法很重要噢,了解selenium的应该都知道,自动化每一步的操作都是在ChromeDriver的基础上来触发的,给它单独拿出来作为一个方法的话,就不用每个用例单独new一个驱动了。
	public static void driver(String url) {
		// TODO Auto-generated method stub
		System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\chromedriver.exe");
		ChromeDriver driver = new ChromeDriver();
		dr = driver;
		Navigation na = dr.navigate();
		dr.manage().window().maximize();
		dr.get(url);
	}
  • activate
    点击操作,这里做了一个异常处理,如果这个元素位置没有找到,则先截图再抛异常,这样便于直观的排查问题。
	/*
	 *  识别元素,并点击 <input type="submit" value="百度一下" id="su"
	 * class="btn self-btn bg s_btn"> 
	 * activate(by.id("su"))
	 */
	public static void activate(By locator) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr,20)).until(ExpectedConditions.presenceOfElementLocated(locator));
			dr.findElement(locator).click();
		} catch (Exception e) {
			UserFunction.screenShotSpecial();
			dr.close();
			throw new Exception("对不起,该元素未抓取到,请您查看当前页面元素位置是否有变动!");
		}
	}

扩展一下。如果一个页面存在多个相同属性值,无法使用唯一值来定位,那么就使用findelements这个方法,比如下面的这个方法:

  • activateByIndex
	/*
	 * 当页面存在多个相同元素时,使用该方法。index是从0开始计算的。比如说页面存在两个相同的submit元素需要点击第二个, 就使用
	 * activateByIndex这个方法,用法activateByIndex(By.id("submitOrder"), 1)
	 * 
	 */

	public static void activateByIndex(By locator, int index) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr, 20))
					.until(ExpectedConditions.presenceOfElementLocated(locator));
			List<WebElement> list = null;
			list = dr.findElements(locator);
			list.get(index).click();
		} catch (Exception e) {
			UserFunction.screenShotSpecial();
			dr.close();
			throw new Exception("对不起,该元素未抓取到,请您查看当前页面元素位置是否有变动!");
		}
	}
  • enterTextIn
    也是加了一个异常处理
	/*
	 * 识别元素,并传值 <input type="text" class="s_ipt" name="wd" id="kw"
	 * maxlength="100" autocomplete="off"> 
	 * enterTextIn(by.id("kw"),"selenium2")
	 */
	public static void enterTextIn(By locator, String value) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr,20)).until(ExpectedConditions.presenceOfElementLocated(locator));
			dr.findElement(locator).sendKeys(value);
		} catch (Exception e) {
			UserFunction.screenShotSpecial();
			dr.close();
			throw new Exception("对不起,该元素未抓取到,请您查看当前页面元素位置是否有变动!");
		}
	}

扩展,相同属性值,不同位置的元素操作,可以先获取这个元素,然后再传入位置来进行输入操作,同activateByIndex

  • enterTextInByIndex
	/*
	 * 当页面存在相同属性值的元素值,需要输入文本的时候,可以采取这个方法。index是从0开始计算的,比如,像页面第5个标签信息为input的元素输入selenium2.
	 * enterTextInByIndex(By.tagName("input"), 4,"selenium2")
	 */
	public static void enterTextInByIndex(By locator, int index,String value) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr, 20))
					.until(ExpectedConditions.presenceOfElementLocated(locator));
			List<WebElement> list=dr.findElements(locator);
			list.get(index).sendKeys(value);
		} catch (Exception e) {
			UserFunction.screenShotSpecial();
			dr.close();
			throw new Exception("对不起,该元素未抓取到,请您查看当前页面元素位置是否有变动!");
		}
	}
  • switchWindow
    这个方法很重要,大家都知道,打开一个网页(窗口A),点击一个连接,页面可能会重新打开一个网页(窗口B),这个时候selenium的默认窗口还是第一个窗口A,但是你需要切换到第二个窗口B。那么直接调用这个方法,然后传入你想定位第几个窗口即可。比如,默认的窗口是A,现在切换到第二个窗口B,则switch_window(1),回到A窗口,则switch_window(0).这样是不是很简单了呢?
	/*
	 * 切换窗口
	 * switchWindow(1)
	 */
	public static void switchWindow(int i) {
		Set<String> winHandels = dr.getWindowHandles();// 得到当前窗口的set集合
		List<String> it = new ArrayList<String>(winHandels); // 将set集合存入list对象
		dr.switchTo().window(it.get(i));// 切换到弹出的新窗口
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// String url = dr.getCurrentUrl();// 获取新窗口的url
		// System.out.println(url);
		// dr.switchTo().window(it.get(0));// 返回至原页面

	}
  • isElementExist
    判断当前页面是否存在某个元素,有则返回true,没有这个元素,则截图抛异常处理。
	/*
	 * 判断元素是否存在
	 */
	public static boolean isElementExist(By locator) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr,20)).until(ExpectedConditions.presenceOfElementLocated(locator));
			return true;
		} catch (Exception e) {
			return false;
		}
	}
  • clear
    清除文本框内容
	/*
	 * 清除输入框
	 */
	public static void clear(By locator) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr,20)).until(ExpectedConditions.presenceOfElementLocated(locator));
			dr.findElement(locator).clear();
		} catch (Exception e) {
			UserFunction.screenShotSpecial();
			dr.quit();
			throw new Exception("对不起,该元素未抓取到,请您查看当前页面元素位置是否有变动!");
		}
	}
  • close
    close和quit要注意区别,close只是将当前打开的窗口关闭。比如打开网页A,后来点击链接新开了一个窗口B,目标窗口已切到B,这个时候需要关闭B窗口,则用close(),如果需要关闭所有的窗口,则用quit()
	/*
	 * 关闭当前窗口
	 */
	public static void close() {
		dr.close();
	}
  • quit
    close和quit要注意区别,quit是将浏览器关闭,针对的是浏览器,而close只是针对当前多个窗口中的一个窗口。
	/*
	 * 关闭浏览器
	 */
	public static void quit() {
		dr.quit();
	}
  • screenShot
    截图,直接调用这个方法即可截图,截图保存的位置结合NewDirectory方法,在项目的testresult下(方法里用的都是相对路径),以当前日期命名的文件夹内,图片名称是根据BasicFunction.DateString()这个方法命名的。
    在这里插入图片描述
	/*
	 * 截图
	 * 
	 */
	public static void screenShot() {
		String filename = BasicFunction.DateString();
		filename = filename + ".jpg";
		String filepath = BasicFunction.NewDirectory();
		File scrFile = ((TakesScreenshot) dr).getScreenshotAs(OutputType.FILE);
		try {
			FileUtils.copyFile(scrFile, new File(filepath + "\\" + filename));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("Can't save screenshot");
			e.printStackTrace();
		} finally {
		}
	}
  • screenShotSpecial异常截图处理
	public static void screenShotSpecial() throws Exception {
		String picname = BasicFunction.dateString();
		picname = picname + ".jpg";
		String filename = System.getProperty("user.dir");
		String file = filename + "\\src\\test_result\\special";
		File scrFile = ((TakesScreenshot) dr).getScreenshotAs(OutputType.FILE);
		try {
			FileUtils.copyFile(scrFile, new File(file + "\\" + filename));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("Can't save screenshot");
			e.printStackTrace();
		} finally {
		}
	}

有疑问的加V了解详情:zx1187463903

到这里,依赖ChromeDriver的几个常用方法已经封装完了,理解了吗?
如果你也搞定了,开心的同时请小编喝个咖啡也极好的呀。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43574761/article/details/89096669