selenium定位动态id元素

 

做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

 

 

  • 17
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在使用 Selenium 定位动态元素时,你可以尝试以下几种方法: 1. 使用显式等待:使用 `WebDriverWait` 类来等待元素的出现或可点击状态。你可以指定等待的最长时间和轮询的频率,直到元素出现或可点击。 ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 创建一个显式等待对象 wait = WebDriverWait(driver, 10) # 10秒为超时时间 # 等待元素出现 element = wait.until(EC.presence_of_element_located((By.ID, 'element_id'))) # 等待元素可点击 element = wait.until(EC.element_to_be_clickable((By.ID, 'element_id'))) ``` 2. 使用隐式等待:在创建 WebDriver 对象之后,设置一个全局的隐式等待时间,在查找元素时等待一段时间,直到元素出现或超时。 ```python driver.implicitly_wait(10) # 10秒为隐式等待时间 # 查找元素 element = driver.find_element(By.ID, 'element_id') ``` 3. 使用动态 XPath:如果元素的属性值是动态生成的,你可以使用 XPath 来定位元素。XPath 提供了各种方法来选择和定位元素,比如使用属性、文本内容、父子关系等。 ```python element = driver.find_element(By.XPATH, '//div[@class="dynamic_class"]') ``` 4. 使用 CSS 选择器:CSS 选择器也可以用于定位动态元素。你可以使用元素的属性、类名、标签名等来选择元素。 ```python element = driver.find_element(By.CSS_SELECTOR, 'input[name="dynamic_name"]') ``` 以上是一些常用的方法,根据具体情况选择合适的方法来定位动态元素

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值