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还可以操作选择框,下拉框,表单,表格当中的各种控件。

发布于 2020-02-05 09:06