做web自动化时,常常会碰到需要定位的元素id不是固定的,无法通过id进行定位,比如,我碰到的一个上传本地图片的“上传”按键元素,通过firebug查看该元素为
因该元素id是动态的,无法通过id属性进行定位,只好换成xpath.
1.通过绝对路径定位:
By.xpath("/html/body/div[3]/div[2]/div/form/div/div[5]/div/div[3]/div/div[3]/div/div/span/input[9]")----无法定位
2.通过元素索引定位:
By.xpath("//input[9]")---成功定位
顺便补上xpath的另外几种定位方式:
3.使用xpath属性定位
By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and @name='kw1']")
4.使用部分属性值匹配(最强大的方法)
By.xpath("//input[starts-with(@id,'file')
By.xpath("//input[ends-with(@id,'_11')
By.xpath("//input[contains(@id,'_')]")
当然,还有其他的方式比如css,name等等,根据定位元素的属性进行选择,一种方式不行时就多试几种其他的方式。
另外,可通过查找动态id的规律,来获取id并定位元素。
比如:
我这里测试需求是,需要上传4张图片,则需要定位4个上传按键,使用上面的//input[9]只能成功定位到第一个按键,后面3个还是无法定位,通过firebug查看元素发现,4个按键的id值虽然是动态的,但是有一定的规律,后面两项的数值是依次递增的,只要在获取的第一个ID值上进行累加即可。
所以成功定位了第一个上传按键后,获取到他的ID值,就可以根据规律算出后面3个按键的id值,即可再通过id属性对其他的三个按键进行定位。
部分代码如下:
String s1=driver.findElement(By.xpath("//input[9]")).getAttribute("id");
System.out.print(s1+"\n");//获取第一个上传按键的id file_0_35440853_1000001_9
String ss1=s1.substring(0,16);//获取前半截不变字串 file_0_35440853_
int ss2=Integer.parseInt(s1.substring(16, 23));//获取变化字符串 1000001
int ss4=Integer.parseInt(s1.substring(24,s1.length()));//获取变化字符串 72
String s2=ss1+Integer.toString(ss2+1)+"_"+Integer.toString(ss4+1);//第二个上传按键id file_0_35440853_1000002_10
String s3=ss1+Integer.toString(ss2+2)+"_"+Integer.toString(ss4+2);//第三个上传按键id file_0_35440853_1000003_11
String s4=ss1+Integer.toString(ss2+3)+"_"+Integer.toString(ss4+3);//第四个上传按键id file_0_35440853_1000004_12