自动化测试的核心技术就是元素定位,我们要想对元素进行操作,必须要找到这个元素的所在位置,webdriver中有很多进行元素定位的方法:
1、xpath定位
xpath定位有很多种定位策略:
使用元素的绝对路径
使用元素的相对路径
使用元素属性定位
使用层级和属性结合定位(使用上级属性定位)
使用层级和属性结合定位(使用逻辑运算符定位)
方法:find_element_by_xpath()
Discuz论坛登录业务:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6) # 思考时间6s
# 根据相对路径定位用户名输入框
driver.find_element_by_xpath('//*[@id="ls_username"]').send_keys('admin')
sleep(6)
# 根据绝对路径定位密码输入框
driver.find_element_by_xpath('/html/body/div[5]/div/div[1]/form/div/div/table/tbody/tr[2]/td[2]/input').send_keys(
'123456')
# 根据相对路径定位登录按钮
driver.find_element_by_xpath('//*[@id="lsform"]/div/div/table/tbody/tr[2]/td[3]/button/em').click()
sleep(6)
driver.quit()
操作步骤:
①打开Discuz论坛首页,点击右键/检查,或者点击F12,进入调试界面
②点击元素检查按钮,然后点击网站中用户名输入框,查看元素源代码
③点击调试界面的源代码,右键/复制/复制Xpath(相对路径)或者复制完整Xpath(绝对路径)
④将复制的Xpath放到 driver.find_element_by_xpath()中
⑤ 依次点击密码输入框、登录按钮,然后将路径全部复制到 driver.find_element_by_xpath()中
2、id定位
HTML文档中的id是唯一的,id定位是查找元素的最佳方法,方法是:
driver.find_element_by_id()和driver.find_elements_by_id
Discuz论坛登录业务:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6) # 思考时间6s
driver.find_element_by_id('ls_username').send_keys('admin') # id元素定位用户名输入框
sleep(6)
driver.find_element_by_id('ls_password').send_keys('123456') # id元素定位密码输入框
# xpath定位登录按钮
driver.find_element_by_xpath('/html/body/div[5]/div/div[1]/form/div/div/table/tbody/tr[2]/td[3]/button/em').click()
sleep(6)
driver.quit() # 退出网页
操作步骤:
①同上
②在调试代码中找到Id的值,复制到driver.find_element_by_id()中
③将密码输入框的id值,复制到driver.find_element_by_id()中
④登录按钮的代码中,发现没有id值,我们用Xpath定位法将路径复制过去
** 3、name定位**
name值在HTMl中不一定是唯一的
方法:find_element_by_name() 和 find_elements_by_name()
Discuz论坛登录业务:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6)
driver.find_element_by_name('username').send_keys('admin') # 使用name定位用户名输入框
driver.find_element_by_name('password').send_keys('123456') # 使用name定位密码输入框
# xpath定位登录按钮
driver.find_element_by_xpath('//*[@id="lsform"]/div/div/table/tbody/tr[2]/td[3]/button/em').click()
sleep(6)
driver.quit()
操作步骤:
①同上
②在调试代码中找到name的值,复制到driver.find_element_by_name()中
③将密码输入框的name值,复制到driver.find_element_by_name()中
④登录按钮的代码中,发现没有name值,我们用Xpath定位法将路径复制过去
4、class定位
通过class属性定位元素,class属性不止有一个属性值,但是只能使用其中一个
方法:find_element_by_class_name()和 find_elements_by_class_name()
Discuz论坛登录业务:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6)
driver.find_element_by_class_name('px').send_keys('admin') # class_name定位用户名输入框
driver.find_element_by_xpath('//*[@id="ls_password"]').send_keys("123456") # xpath定位密码输入框
# xpath定位登录按钮
driver.find_element_by_xpath('//*[@id="lsform"]/div/div/table/tbody/tr[2]/td[3]/button/em').click()
sleep(6)
driver.quit()
操作步骤:
①同上
②在调试代码中找到class的值,选择其中一个,复制到driver.find_element_by_class_name()中
③查看密码输入框源代码时,发现密码输入框的class值与用户名输入框的class值是一样的,我们就用xpath定位法将路径复制到driver.find_element_by_xpath()中
④登录按钮的源代码中没有class值,使用xpath定位法将路径复制到driver.find_element_by_xpath()中
5、tag定位
在HTML中,每一个元素都是tag,在一个网页中通常会有很多个重复的tag,用tag来定位元素,相对于其他方法效率很低
方法:find_element_by_tag_name()和 find_elements_by_tag_name()
Discuz论坛登录业务:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6)
driver.find_elements_by_tag_name('input')[0].send_keys('admin') #tag定位用户名输入框
sleep(6)
driver.find_elements_by_tag_name('input')[2].send_keys('123456') #tag定位密码输入框
sleep(6)
driver.find_elements_by_tag_name('em')[0].click() #tag定位登录按钮
sleep(6)
driver.quit()
操作步骤:
①同上
②在源代码中,找一个最近的标签(input),然后去网页源代码中查找这个标签,看看它是第几个(第一个)
③将input标签放到driver.find_elements_by_tag_name()中,因为数组下标是从0开始的, 查找出来的是第一个,下标就是(n-1),应该写成[0]
④找到密码输入框的标签(input),跟用户名输入框的标签一样,只是顺序下标不一样,密码输入框的标签是第三个,应该写成[2]
⑤找到登录按钮的标签(em),然后去网页源代码中查找这个标签,看看它是第几个(第一个)
⑤将input标签放到driver.find_elements_by_tag_name()中,因为数组下标是从0开始的,查找出来的是第一个,下标就是(n-1),应该写成[0]
6、css定位
css比较灵活,可以选择任意属性,定位速度比xpath快
方法:find_element_by_css_selector()和 find_elements_by_css_selector()
css也有很多种定位策略:
使用id定位
使用class定位
使用属性定位
使用元素层级、属性组合定位
Discuz论坛登录业务:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6)
driver.find_element_by_css_selector('#ls_username').send_keys('admin') # 使用class中id定位
driver.find_element_by_css_selector('[name="password"]').send_keys('123456') # 使用class中属性定位
# 使用xpath定位
driver.find_element_by_xpath('//*[@id="lsform"]/div/div/table/tbody/tr[2]/td[3]/button/em').click()
sleep(6)
driver.quit()
操作步骤:
①同上
②在用户名输入框代码中,能看到id和name属性以及class属性等,我们可以随意选择这些数据进行css定位,在这里我们使用id值,将id值复制到driver.find_element_by_css_selector()中,id值前必须加上 # (如果选择class值的话,就必须加上.)
③在密码输入框代码中,我们选择name属性值,普通属性值用[]括起来,同时注意引号的嵌套
④登录按钮使用xpath定位
7、link定位
link主要是定位文本链接
方法:find_element_by_link_text() 和 find_elements_by_link_text()
Discuz论坛“交友”链接:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6) # 思考时间6s
driver.find_element_by_link_text('交友').click() # 使用link定位
sleep(6)
driver.quit()
操作步骤:
①将文本链接的文字(交友)复制到find_element_by_link_text()中即可
8、partial link 定位
有时链接文本比较长时,我们可以使用partial link定位,意思是部分文本定位
方法:find_element_by_partial_link_text()和 find_elements_by_partial_link_text()
Discuz论坛“查看新帖”链接:
from time import sleep # 导入时间模块
from selenium import webdriver # 从selenium模块中导入webdriver子模块
url = "http://192.168.152.128/upload/forum.php" # 定义url地址
driver = webdriver.Chrome() # 定义一个对象
driver.get(url=url) # 访问url
sleep(6) # 思考时间6s
driver.find_element_by_partial_link_text('查看新').click() # 使用partial link定位
sleep(6)
driver.quit()
操作步骤:
①将文本链接的部分文字(查看新)复制到driver.find_element_by_partial_link_text()中即可
勤能补拙是良训,一份辛苦一份才
版权归原作者 three996 所有, 如有侵权,请联系我们删除。