WEB自动化-selenium元素定位最好用的方法
selenium元素定位的方法虽然有很多,但如果被测系统的前端页面命名不规范或者使用第三方插件的话,元素定位的工作就会很痛苦,就算使用Xpath花费很大精力定位到了元素,但可维护性不一定强,下一个版本回归测试的时候又无法定位。
今天介绍一个简单实用的元素定位方法:normalize-space文本定位,本人在以往项目中使用该方法可以定位到90%左右的页面元素,并且可维护性高。
normalize官方解释是:通过去掉前导和尾随空白并使用单个空格替换一系列空白字符,使空白标准化。如果省略了该参数,上下文节点的字符串值将标准化并返回。
我使用normalize要用到的功能就是:通过页面中的文本来定位元素。
WebElement WE = driver.findElement(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='文本']"));
下面以知乎官网为例介绍一下使用方法。
比如我要点击页面中的“发现”,只需要这样写:
driver.findElement(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='发现']")).click();
这里需要注意的是:以页面text定位必须是完整的文本,不能取部分文本(如果需要取部分文本来定位,请参见contains正则的使用方法)
同理,要点击“首页”或者“提问”,修改对应文字就可以了:
driver.findElement(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='首页']")).click();
driver.findElement(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='提问']")).click();
上面介绍了normalize的基本用法,但是在实际项目中需要重写一下该方法,用来适用各种情况,下面的java代码复制即可用:
//////////////////////////////////////////
/**点击文本为text的元素,如果有多个相同text就从第一个开始开始判断是否可见,可见就点击操作
* @param string
* @throws InterruptedException
* @throws ParseException
* */
public static void normalize_texts_clicks(String text) throws Exception{
int size=driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']")).size();
// System.out.println ("元素个数:"+size);
if(size==0)
System.out.println("页面中没有找到文字:"+text);
}
for(int i=0;i<size;i++){
try{
if(driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']")).get(i).isDisplayed()){
driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']")).get(i).click();
break;
}
}catch (Exception e) {
}
}
}
/////////////////////////////////////
使用:
normalize_texts_clicks(“发现”);
normalize_texts_clicks(“首页”);
normalize_texts_clicks(“提问”);
上面的方法适用于元素对象有text()的点击事件。那么没有text的元素,或者是一些输入操作该如何操作呢?
下面介绍一下对输入框的操作。原理是通过“等你来答”元素的后面的input元素来定位:如下图:
//////////////////
/**
* 页面中文字旁边的输入框,如果有多个就从第一个开始开始判断是否可见
* @param text页面中文本
* @param string2 输入的内如
* @throws InterruptedException
* @throws ParseException
*/
public static void normalize_inputs_sendkeys(String text,String string2)
throws InterruptedException, ParseException {
int size=driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']/following::input[1]")).size();//使用方法following::(取当前元素后面的元素),input代表输入框。
if(size==0){
System.out.println ("页面中没有找到文字:"+text);
}
for(int i=0;i<size;i++){
try{
if(driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']/following::input[1]")).get(i).isDisplayed()){
driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']/following::input[1]")).get(i).clear();
driver.findElements(By.xpath(".//*[normalize-space(text()) and normalize-space(.)='"+text+"']/following::input[1]")).get(i).sendKeys(string2);
break;
}
}catch (Exception e) {
}
}
}
/////////////////////
使用:在输入框中输入文本:搜索的文本内容
normalize_inputs_sendkeys(“等你来答”,”搜索的文本内容”);
//////////////////////////////////////
依次类推,使用normalize还可以操作选择框,下拉框,表单,表格当中的各种控件。