selenium找不到元素的几种原因(通过xpath定位元素不准确)

1.找到元素后,click没有作用,可以试试用action里的sendKeys模仿键盘敲enter键

(注意:1.enter之前可能需要tab;2.sendKeys之后需要perform)

例:

//点击数据中心类型下拉框

createObject.type.click();

//数据中心类型下拉框click点不到,用tab键和enter键代替(sendKeys之后要perform一下)

actions.sendKeys(Keys.TAB);

actions.perform();

actions.sendKeys(Keys.ENTER);

actions.perform();

(另外,有时能点到,有时点不到,可能是页面不稳定,可以sleep一下试试)

2.获取某个元素不好获取时,可以获取他的子元素/父元素,然后获取对应元素

注意,`.`代表当前节点; '..'代表父节点

Webelement div= driver.findElement(By.xpath("//div[@id,'div']"));

通过xpath定位div的父元素:

WebElement input = div.findElement(By.xpath("./.."));

通过xpath定位div的子元素input(//表示从当前元素开始寻找下级、下下级、下下下级等):

WebElement input = div.findElement(By.xpath(".//input"));

3.获取元素进行点击等操作时,最好获取input等元素,有的元素是不可点击的,如span

4.获取到的元素是一组元素时,用获取多个元素的方法,获取到之后再get(i)来获取其中的某一个元素

5.清除输入框中的数据使用clear方法无效的时候,可以模拟键盘ctrl+A然后delete,具体操作如下updateObject.code.sendKeys(Keys.chord(Keys.CONTROL,"a"));

updateObject.code.sendKeys(Keys.DELETE);

6.如果在浏览器中新打开了一个页面,需要切换到新页面

//获取所有的打开的浏览器窗口 driver.getWindowHandles() 会返回一个set集合
Set<String> winHandelsSet=driver.getWindowHandles();
// 将set集合存入list对象
List<String> winHandels = new ArrayList<String>(winHandelsSet);
//切换到新窗口
driver.switchTo().window(winHandels.get(1));
//切换到原来的窗口
driver.switchTo().window(winHandels.get(0));

顺便补充一个关闭tab窗口的方法

# 1.关闭浏览器全部标签页
driver.quit()
# 2.关闭当前标签页(从标签页A打开新的标签页B,关闭标签页A)
driver.close()

7.定位复合class元素

例如:一个日历选择控件,今天的日期class是:<td class="day active">9</td>,其中,day 和 active 就是两个class 属性名称

解决方法:①如果这两个className中有一个是可以唯一确定这个元素,可以选择其中一个使用,如findElement(By.className("active");

②如果不能唯一确定,就先findElements,然后get(i);

8.元素在页面下方,需要滚动页面才能点到

参考 https://www.cnblogs.com/dk1024/p/11743889.html

本人测试,这个方法最好用 

WebElement element = driver.findElement(By.id("ID")));

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);

### 如何优化 Appium 中的 XPath 表达式 #### 1. 减少复杂度 复杂的 XPath 可能会降低查速度并影响测试性能。应尽可能简化表达式,只选择必要的属性和层次结构。 例如,如果目标元素具有唯一的 `id` 或 `name` 属性,则优先使用这些简单而直接的选择是冗长的路径: ```xml //element[@unique-id='value'] // 更高效的方式 ``` 而非: ```xml /html/body/div[3]/section/article/form/table/tbody/tr/td/input // 推荐的绝对路径 ``` #### 2. 避免过度依赖位置索引 当定位一组相似类型的多个同级节点时,尽量避免基于顺序编号来指定特定项的位置,因为界面布局的变化可能会破坏这种模式。可以考虑利用其他唯一特性如类名、文本内容等来进行筛选[^4]。 #### 3. 利用谓词条件过滤 适当运用 `[ ]` 内部的逻辑判断语句可以帮助更精确地匹配所需对象而必遍历整个 DOM 树。比如结合 `and`, `or` 关键字以及内置函数(如 `contains()` 和 `starts-with()`),能够有效缩小范围从而加快查询过程[^3]。 示例代码如下所示: ```python self.driver.find_element_by_xpath("//button[starts-with(@text,'Submit')]") # 或者 self.driver.find_element_by_xpath("//input[contains(concat(' ',normalize-space(@class),' '),'submit-button')]") ``` #### 4. 尽量采用相对路径代替绝对路径 相对于根节点定义完整的 HTML 结构树形图虽然直观明了,但在页面结构调整频繁的情况下容易失效;相反地,从当前上下文中出发构建较短距离内的关联关系往往更加稳定可靠[^5]。 #### 5. 缓存已解析的结果集 对于那些需要反复访问相同集合的情况,在首次检索之后可将其存储起来供后续操作调用,减少重复计算开销的同时也能提升整体执行效率[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值