目录
在学习selenium自动化测试之前,首先要学会元素定位。
一、什么样的元素可以被定位?
举个🌰:在淘宝网这个页面中,input输入框有id、name、class等属性,这里就可以通过元素具有的属性选择相应的定位方式来获取元素。
二、元素定位有哪几种方式呢?
1.find_element_by_id
2.find_element_by_name
3.find_element_by_class_name
4.find_element_by_tag_name
5.find_element_by_link_text
6.find_element_by_partial_link_text
7.find_element_by_xpath
8.find_element_by_css_selector
细心的小伙伴们可能注意到了,小王在这里用的是find_element方法,当然咯,find_elements也是可以进行定位的。两者的区别在于单数形式定位和查找一个元素,复数形式返回的是列表。如果有不明白的小伙伴可以在【find_element_by_tag_name】的章节中找到答案~
三、前置说明
语言:python
工具:selenium
使用方法:from selenium import webdriver
软件:pycharm
下载地址:https://www.jetbrains.com/pycharm/
注意事项:下载完后需要进行环境变量配置
驱动:chromedriver
下载地址:http://npm.taobao.org/mirrors/chromedriver/
注意事项:chromedriver与chrome的版本一定要对应
测试网站:
1.www.taobao.com
2.https://www.ctrip.com
3.https://account.cnblogs.com/
四、元素定位详解
1.find_element_by_id
在html中,id的属性是唯一的。因此,通常利用find_element_by_id的方法进行定位。
# 1.导入selenium
from selenium import webdriver
from time import sleep
# 2.打开浏览器——使用谷歌浏览器
driver = webdriver.Chrome('./chromedriver')
# 3.输入网址
driver.get("https://www.taobao.com/")
sleep(5)
# 4.元素定位
# id定位输入框
search = driver.find_element_by_id('q')
print(search.get_attribute("outerHTML")) #查看对应的源码
# 5.关闭浏览器
driver.quit()
输出结果如下:
道路千万条,谨慎第一条!有一种情况不能通过find_element_by_id的方式进行定位,那就是动态id。
动态id通常是拼接了一串数字,如上图的ks_component384。当不确定这个id是否为动态id的时候,可以右键查看源代码,win用户ctrl + F / mac用户command + F快捷搜索。动态id是搜索不到的哟~
通过以上实例发现,根据id属性进行定位的方式有其局限性。因此掌握多种定位方式并能灵活应用又为重要。
2.find_element_by_name
当元素有name属性时,通过find_element_by_name的方式进行定位。
# name定位输入框
search = driver.find_element_by_name('q')
print(search.get_attribute("outerHTML"))
然鹅,在html页面中,name的属性往往不是唯一的。当获取不到这个元素时,可以在检查窗口的Console界面通过输入“document.getElementsByName(‘xxx’)”查看这个属性值是否唯一。
3.find_element_by_class_name
找到具有class属性的元素,可以通过find_element_by_class_name的方式进行定位。
search = driver.find_element_by_class_name('search-combobox-input')
print(search.get_attribute("outerHTML"))
4.find_element_by_tag_name
通过元素的标签名进行定位又是另一种定位方式。以携程网为例:
# 1.导入selenium
from selenium import webdriver
from time import sleep
# 2.打开浏览器——使用谷歌浏览器
driver = webdriver.Chrome('./chromedriver')
# 3.输入网址
driver.get("https://www.ctrip.com/")
sleep(5)
# 4.元素定位
# 4.1 单数形式
ele = driver.find_element_by_tag_name("input")
print("单数形式",ele.get_attribute("outerHTML"))
# 4.2 复数形式
eles = driver.find_elements_by_tag_name("input")
print(len(eles))
# 5.关闭浏览器
driver.quit()
输出结果如下:
总结一下:
1.当页面中有唯一的标签时,可以使用driver.find_element_by_tag_name的方式进行定位
2.当有多个标签相同的元素时,使用driver.find_element_by_tag_name,默认定位的是第一个标签名
3.当有多个标签相同的元素时,使用driver.find_elements_by_tag_name得到所有标签相同的元素,使用列表遍历的形式,对具体的元素做操作
5.find_element_by_link_text
通过超文本链接的文字信息来定位元素。以淘宝网为例:
# 4.1 link_text定位
link = driver.find_element_by_link_text("我的淘宝")
print(link.get_attribute("outerHTML"))
6.find_element_by_partial_link_text
同样,可以用find_element_by_partial_link_text的方式进行定位,其中()的字符为find_element_by_link_text()的子串。
plink = driver.find_element_by_partial_link_text("的淘")
print(plink.get_attribute("outerHTML"))
两种方式最后输出的结果相同:
五、本章总结
本章重点介绍了通过id、name、class等属性定位相应的元素,是较为基础的查找元素的方法。在元素定位的过程中,小王也碰到了一些问题。接下来我们就来分析一下常见的错误类型:
1.AttributeError: ‘list’ object has no attribute ‘get_attribute’
出现该错误说明在寻找元素的时候使用了find_elements的方法。find_element是定位和查找一个元素,而find_elements是定位和查找所有元素的list。
2.selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
说明元素没有定位到,可能是属性值重复了或者定位的语法写错了。
在下节内容中将重点介绍find_element_by_css_selector及find_element_by_xpath的定位方法,疫情期间希望大家能够保护好自己的身体,然后不要忘记学习鸭。