最近在学习Selenium的自动化测试,最基础的学习就是元素定位了,鉴于定位方法较多,我又是个初学者,所以边学边记录一下。感谢白月黑羽提供的学习视频,又想要学习的去B站上搜索,对于入门者来说真的很棒,再次感谢!
(一)元素定位方法
如上图所示,有八种元素定位方法,要注意的是,用id获取的元素肯定是唯一的,而用其他的方法可能会找到多个元素,但只会返回第一个。所以其他七种定位方法有对应的find_elements_by_X的方法,用find_elements_by_X会返回元素集合。
使用css选择器和xpath来定位元素,对于初学者来说可能会有些复杂。因为对css选择器和xpath不熟的话,我们不知道在方法中该输入什么内容。
有个简单的解决方法,我们可以将鼠标移到对应元素的HTML代码上方,“右键——>Copy——>Copy selector”来获取css 选择器,同理“右键——>Copy——>Copy xpath”来获取xpath。例如:find_element_by_css_selector('#su') 和 find_element_by_xpath('//*[@id="su"]'),这是分别通过css选择器和xpath的方式去获取百度首页的百度一下按钮这个元素。
- css选择器定位元素时,默认id用“#”号,class用英文句号“.” ,父元素和子元素之间用“>”连接,祖宗元素和后代元素之间用空格连接,如果需要获取多个不同属性的元素,则用英文逗号“,”相隔。
- xpath则是用 [@属性名=''属性值"]的方式,即[@id="id值"],[@class=“class值”]等等,但必须注意的是,xpath中用到的class值必须是完整的,而css选择器只需要取其中一个。
举个例子,示例代码如下:
<html>
<body>
<!--省略一长串代码-->
<div id="A">
<h1 class="aaa a-btn">点吧</h1>
<p>健康</p>
<p>平安</p>
<p>快乐</p>
</div>
</body>
</html>
(1)如果想取到a1这个元素,可以用以下几种方式:
# 取元素h1
#在css选择器查找元素时,“#”代表通过id获取元素,“>” 代表父子元素的关系,空格 代表祖宗元素跟后代元素的关系
#css选择器的“>”相当于xpath的“/”,同理 空格 相当于 “//”
find_element_by_css_selector("html>body #A>h1")
find_element_by_xpath('/html/body//*[@id="A"]/h1')
#上面的也可以简写
find_element_by_css_selector("#A>h1")
find_element_by_xpath('//*[@id="A"]/h1')
# 在css选择其查找元素时,“.”代表通过class值获取元素,且只能取一个class值(指空格分开的多个class值的其中一个),而xpath要取完整的class值
find_element_by_css_selector('#A>.aaa') 或 find_element_by_css_selector('#A>.a-btn')
find_element_by_xpath('//*[@id="A"]/h1[@class="aaa a-btn"]')
要注意的是:上面的代码中有比较多的用到星号“*”,这其实是一个通配符,表示无所谓元素的tag名称是什么。当然我们也可以用正确的tag名称去代替它,是一样的定位效果。
(2)如果想取多个元素,例如“a1”和所有的“p”元素,可以用下面的方式:
#取全部a1和p元素
#css选择器的“,”相当于xpath的“|”
find_element_by_css_selector("#A>a1 , #A>p")
find_element_by_xpath("/A/a1 | /A/p")
(二)实操(白月黑羽的测试用例,文档下载:https://github.com/jcyrss/baiyueheiyu/files/3986495/tcs-selenium.xlsx)
1、不完整或错误的账号密码登录:
from selenium import webdriver
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(r'D:\ChromeDriver\chromedriver.exe')
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('http://127.0.0.1/mgr/sign.html')
#UI-0001 测试步骤:1、不输入管理员账号,输入密码 88888888;2、登录 预期结果:提示“请输