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

 

 

### 如何使用Selenium定位页面上的动态元素 对于动态变化的元素,传统的静态选择器可能无法有效工作。为了应对这一挑战,可以采用多种策略来增强定位的灵活性和可靠性。 #### 使用显式等待配合动态属性匹配 当元素具有唯一但动态变化的部分时,可以通过部分匹配的方式进行定位。例如,如果某个ID前缀固定而后续部分随机生成,则可利用`startswith()`或正则表达式的功能[^1]: ```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) element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "[id^='fixedPrefix']"))) ``` #### 利用XPath的强大查询能力 XPath提供了丰富的语法支持复杂条件下的节点选取,特别是处理那些只有运行时才能确定特性的对象非常有用。比如基于父级或其他关联标签的关系路径可以帮助锁定目标位置[^2]: ```python dynamicElement = driver.find_element(By.XPATH, "//div[@class='parentClass']/span[contains(text(), 'Dynamic Text')]") ``` #### 结合JavaScript执行脚本获取隐藏信息 有时所需的信息并不直接暴露于HTML源码之中,而是由前端框架计算得出并渲染到DOM树上。此时借助浏览器内置API能够绕过这些障碍取得真实值: ```javascript scriptResult = driver.execute_script('return document.querySelector("custom-element").shadowRoot.querySelector(".internal")') ``` 以上三种方式分别适用于不同场景下对动态元素的操作需求,在实际应用过程中可以根据具体情况组合运用以达到最佳效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值