上一篇讲了另外三个文件里的方法(与驱动无关),下面来详细讲解一下,我们最最主要的几个方法(依赖驱动)。
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的几个常用方法已经封装完了,理解了吗?
如果你也搞定了,开心的同时请小编喝个咖啡也极好的呀。