使用xpath定位遇到的坑

简介: 使用xpath定位遇到的坑

今天使用xpath 去定位某个元素的位置, selenium执行机执行的时候 和手工打开页面复制出来的xpath 不一样, 着实奇怪。 我看了他的页面是通过左右两边隐藏的, 点击某个图标的时候,会出现对应的菜单栏。  菜单也是动态加载的,应该是动态加载的问题, 可能有其他元素新增删除,给把位置给错乱了。但很奇怪的是,打开同一个页面出来的就不一样的, 感觉自动化对于动态的页面,获取的xpath还是定位不到,或是嵌套了iframe 标签,这个情况也是不行。


对于xpath 定位不到,我看很多网上说的,大体有6种情况:


(1)定位属性值是动态变化的情况(常见问题)


现象:在我们定位元素的时候,发现有id, name或其他的属性存在,于是就用相应的定位方法去定位。可是运行的时候提示定位不到,然后我们再去查看元素的时候,发现属性值和我们写代码的时候不一样了。


原因:通常产生这种情况的原因就是你使用的属性值是动态变化的,主要表现有属性值是一串数据,或是字符加一串数据等情况。页面加载一次变化一次,每次都不相同。


解决办法:我们应尽量避免用这样的属性值去定位,而采用这个元素下的其他固定不变的属性值。或是向上层查找,采用Xpath定位。


(2)Iframe中的元素定位出错的情况


现象:我们在定位元素的时候,查看网页源码,发现有iframe存在。可是我们没有做特殊处理,而是直接用通用的定位方法,name ,id,  xpath或者CSS来定位。用Selenium IDE验证能查找到元素,可是运行测试用例的时候,总是元素找不到。


原因:在我们运行测试脚本的时候,代码获取的是页面的句柄,而iframe在句柄中是当成一个元素来处理的。脚本是没有办法自己去iframe中去定位元素的,所以当搜索完页面时,发现找不到要定位的元素,就当错误处理。


解决办法:当需要定位iframe中的元素的时候,先将句柄切换到iframe中(driver.switchTo().frame("framename");),然后再去定位,就能定位到要测试的元素。


(3)不同页面或iframe切换时元素定位情况


现象:当我们在编写测试用例的时候,会遇到打开一个新页面,或是切换到一个新的iframe中,然后再去定位元素进行操作。但是我们的定位方法写的没有问题,而且在Selenium IDE中也验证通过,可是代码运行的时候还是会提示找不到元素。


原因:其实这个和定位iframe中元素的情况是一样的,在打开一个页面或是切换到一个iframe的时候,driver获取的是当前页面或是iframe的句柄。当你的操作切换到新的页面或是iframe的时候,如果代码不去做相应的切换,查找元素的时候还会在原来的句柄下查找,当然会出现查找不到的情况。


解决办法:当操作切换页面或是iframe的时候,我们的测试脚本也要做相应的切换,选择新打开的页面或是切换到新的iframe下。然后再去定位的时候,就会在新页面或是iframe下定位了。


(4)Xpath编写出错的情况(常见问题)


现象:如果我们对一个元素编写了对应的Xpath,然后在没有通过Selenium IDE进行验证的情况吧,就去编写代码执行测试用例。会出现查找不到元素的情况,或是页面发生了变化,导致Xpath路径有了变化,也会查找不到元素。


原因:主要的问题就是Xpath编写出错了,或是页面有改动。不管是增加了新的模块或是隐藏的div,都会影响Xpath路径的。


解决办法:将代码中的Xpath拷出来,放到Selenium IDE中进行验证。如果出错了,就做相应的修改。这个也是代码维护中当遇到的问题,被测试对象变化,导致测试用例的修改。


(5)操作速度过快,被定位的元素没有加载出来的情况(常见问题)


现象:在测试用例运行过程中,会出现被定位的元素有的时候能定位的到,有的时候却定位不到的现象。而我们去页面上验证我们的定位方法的时候,没有一点儿问题,显示不是定位方法写错了。


原因:这种情况多半是因为测试用例执行到代码的时候,被定位元素没有加载出来造成的。网速原因,执行代码的机器原因,都会造成加载比程序执行的慢的情况。


解决办法:在我们定位元素之前,评估一下页面的加载情况,如果有加载慢的地方,需要添加一定等待时间self.sleep(5000),等上几秒后再去定位操作。


(6)定位页面嵌入式元素的情况(很少遇到)


现象:在页面中会有一些儿嵌入式元素,如object,播放器等。这个时候,我们对其操作的时候,是无法定位到上面的元素的。


原因:嵌入式元素对webdriver来说是一个元素,不管里面包含多少元素,都无法操作。对于object对象,网上有说要对相应的Flash重新编译,添加相应的代码或是控件才能定位。但这样一样又不安全了,所以嵌入式对象一直是自动化测试的盲区。


解决办法:嵌入式对象如果是简单的单击操作,可是用模拟鼠标单击相应的区域,就能完成操作。如果是输入操作,我们可以先模拟点击输入区,然后模拟键盘进行输入。除此之外,好像也没有什么好的办法。

目录
相关文章
|
6月前
|
数据采集 人工智能 监控
40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析
Crawl4AI 是2025年GitHub上备受瞩目的开源网络爬虫工具,专为AI时代设计。它不仅能抓取网页内容,还能理解页面语义结构,生成适配大语言模型的训练数据格式。上线半年获4万+星标,应用于1200+AI项目。其功能亮点包括智能内容提取引擎、AI就绪数据管道和企业级特性,支持动态页面处理、多语言识别及分布式部署。技术架构基于Python 3.10与Scrapy框架,性能卓越,适用于AI训练数据采集、行业情报监控等场景。相比Scrapy、BeautifulSoup等传统工具,Crawl4AI在动态页面支持、PDF解析和语义分块方面更具优势
1870 0
40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析
|
关系型数据库 MySQL 网络安全
|
JavaScript
【selenium】下拉滚动条
简介:【selenium】下拉滚动条
【selenium】下拉滚动条
|
12月前
|
JavaScript 前端开发 API
JavaScript动态渲染页爬取——Playwright的使用(二)
JavaScript动态渲染页爬取——Playwright的使用(二)
616 1
|
10月前
|
JSON JavaScript 测试技术
Postman 使用教程:从基础到高级
Postman是一款强大的API开发和测试工具,支持从基础请求发送到复杂API集成。本文详细介绍了Postman的基础使用,包括安装、界面概览、发送请求、设置请求头等,以及高级功能,如使用环境变量、创建请求集合、编写测试脚本及使用Newman进行命令行测试,帮助用户全面掌握Postman的使用技巧。
3019 28
Postman 使用教程:从基础到高级
|
7月前
|
存储 监控 安全
如何排查常见的 Windows 应用程序错误和崩溃
本文介绍了如何通过事件日志分析来诊断Windows应用程序错误和崩溃的根本原因。文章首先解释了应用错误的表现形式及常见事件ID(如1000、1001等),并分析了导致崩溃的原因,包括硬件问题(如存储不足、外部因素)和软件问题(如编码错误、数据损坏、.NET Framework兼容性)。接着,提供了几种故障排除方法,例如运行系统文件检查器(SFC)、执行干净启动、检查更新以及重新安装.NET Framework。最后,探讨了使用日志管理工具(如EventLog Analyzer)集中分析崩溃事件的功能,包括预置报表、时间轴分析、实时警报和自动化响应,帮助管理员高效解决应用问题。
634 1
|
存储 SQL 关系型数据库
MySQL中的当前读和快照读及其区别
MySQL中的当前读和快照读及其区别
1139 0
|
Web App开发 Java Linux
NoSuchDriverException
【8月更文挑战第10天】
1069 3
|
JavaScript 测试技术 API
|
存储 缓存 JSON
详解HTTP四种请求:POST、GET、DELETE、PUT
【4月更文挑战第3天】
66728 4
详解HTTP四种请求:POST、GET、DELETE、PUT