Selenium元素定位

2018年11月13日 1.21k 次阅读 6 条评论 1 人点赞

Selenium常用的8种元素基本定位方式

find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()
在这里将对各种元素定位方式统一使用百度首页进行示例,详细操作步骤有以下内容:
1.打开浏览器,进入百度首页(www.baidu.com);
2.百度页面输入关键字 www.testclass.cn 进行搜索;
3.关闭浏览器;

首先,通过前端工具(火狐浏览器的Firebug)或者直接按F12进入开发者模式查看具体前端代码:

find_element_by_id()

#coding=utf-8
#www.testclass.cn
#Altumn
#2018-11-13
from selenium import webdriver
import time

 
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get("http://www.baidu.com")
 
driver.find_element_by_id("kw").send_keys("www.testclass.cn")#通过id属性定位输入框;
driver.find_element_by_id("su").click()#通过id属性定位“百度一下”查询按钮;
 
time.sleep(2)
driver.quit()

find_element_by_name()

#coding=utf-8
#www.testclass.cn
#Altumn
#2018-11-13
from selenium import webdriver
import time

 
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get("http://www.baidu.com")
 
driver.find_element_by_name("wd").send_keys("www.testclass.cn")#通过name属性定位输入框;
driver.find_element_by_id("su").click()
 
time.sleep(2)
driver.quit()

find_element_by_class_name()

#coding=utf-8
#www.testclass.cn
#Altumn
#2018-11-13
from selenium import webdriver
import time

 
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get("http://www.baidu.com")
 
driver.find_element_by_name("wd").send_keys("www.testclass.cn")
driver.find_element_by_class_name("s_btn").click()#通过class name属性定位“百度一下”查询按钮;
 
time.sleep(2)
driver.quit()

以下几种定位方式通过定位下图input标签的输入框示例:

find_element_by_tag_name

driver.find_element_by_tag_name("input")#通过tag name属性定位input输入框;

find_element_by_xpath()

通过xpath定位,xpath定位有N种写法,这里列几个常用写法:

driver.find_element_by_xpath("//*[@id='kw']")
driver.find_element_by_xpath("//*[@name='wd']")
driver.find_element_by_xpath("//input[@class='s_ipt']")
driver.find_element_by_xpath("/html/body/form/span/input")
driver.find_element_by_xpath("//span[@class='soutu-btn']/input")
driver.find_element_by_xpath("//form[@id='form']/span/input")
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']")

xpath定位,具有[相对路径][据对路径]的区别:
相对路径:即相对于上下文节点的路径;
绝对路径:即从根目录开始的完整的路径;

driver.find_element_by_xpath('//input[@id="kw"]').send_keys("www.testclass.cn")     #相对路径
driver.find_element_by_xpath('//input[@name="wd"]').send_keys("www.testclass.cn")   #相对路径
driver.find_element_by_xpath("//input[@id='kw' and @name='wd']").send_keys("www.testclass.cn")  #相对路径
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("by_xpath相对路径")     #相对路径
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys("www.testclass.cn")#绝对路径
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input[@id="kw"]').send_keys("www.testclass.cn")#绝对路径

find_element_by_css_selector()

通过css定位,css定位有N种写法,这里列几个常用写法:

driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector("[name=wd]")
driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector("html > body > form > span > input")
driver.find_element_by_css_selector("span.soutu-btn> input#kw")
driver.find_element_by_css_selector("form#form > span > input")

css定位,同样具有[相对路径][据对路径]的区别:
相对路径:即相对于上下文节点的路径;
绝对路径:即从根目录开始的完整的路径;

#by_css_selector #绝对路径
driver.find_element_by_css_selector('html>body>div>div>div>div>div>form>span>input[id="kw"]').send_keys("www.testclass.cn")#绝对路径
#by_css_selector #相对路径
driver.find_element_by_css_selector('input[id="kw"]').send_keys("www.testclass.cn")#相对路径
driver.find_element_by_css_selector("#kw").send_keys("www.testclass.cn")#相对路径

find_element_by_link_text()

通过find_element_by_link_text()定位下图百度首页上的一组文本链接。find_element_by_link_text()

driver.find_element_by_link_text("新闻").click()
driver.find_element_by_link_text("网页").click()

find_element_by_partial_link_text()

driver.find_element_by_partial_link_text("新").click()
driver.find_element_by_partial_link_text("乐").click()
driver.find_element_by_partial_link_text("页").click()

Selenium通过elements复数定位

find_elements_by_name()
find_elements_by_id()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
复数定位方式每次取到的都是具有相同类型属性的一组元素,所以返回的是一个list队列.我们可以通过选择具体第几个元素进行单个元素定位;
百度首页右上角有新闻、hao123、地图、视频、贴吧、学术一些文字链接,查看源码可以发现,这些链接都有共同的class,class="mnav"。接下来我们通过find_elements_by_class_name()进行元素定位;详细元素定位代码如下:

#coding=utf-8
#www.testclass.cn
#Altumn
#2018-11-13

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
driver.maximize_window()

#定位一组元素;
elements=driver.find_elements_by_class_name("mnav")
print(len(elements))

#循环打印出每个元素的属性值;
for i in range(len(elements)):
    print("第" + str(i) + "个元素")
    print(elements[i].get_attribute("name"))
    print(elements[i].get_attribute("class"))

输出结果如下所示:

PS C:\Users\WangXiao\Desktop\mystuff> cd 'C:\Users\WangXiao\Desktop\mystuff'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Programs\Python\Python36\python.exe' 'c:\Users\WangXiao\.vscode\extensions\ms-python.python-2018.7.1\pythonFiles\PythonTools\visualstudio_py_launcher.py' 'C:\Users\WangXiao\Desktop\mystuff' '63291' '34806ad9-833a-4524-8cd6-18ca4aa74f14' 'RedirectOutput,RedirectOutput' 'c:\Users\WangXiao\Desktop\mystuff\elements.py'

DevTools listening on ws://127.0.0.1:12164/devtools/browser/06ead576-8801-4f73-8cd9-38ec1678e2d9
6
第0个元素
tj_trnews
mnav
第1个元素
tj_trhao123
mnav
第2个元素
tj_trmap
mnav
第3个元素
tj_trvideo
mnav
第4个元素
tj_trtieba
mnav
第5个元素
tj_trxueshu
mnav

这样你就可以通过元素的属性值判断你要定位的元素:

driver.find_elements_by_class_name("mnav")[0].click()#点击“新闻”;
driver.find_elements_by_class_name("mnav")[1].click()#点击“hao123”;
driver.find_elements_by_class_name("mnav")[2].click()#点击“地图”;
driver.find_elements_by_class_name("mnav")[3].click()#点击“视频”;
driver.find_elements_by_class_name("mnav")[4].click()#点击“贴吧”;
driver.find_elements_by_class_name("mnav")[5].click()#点击“学术”;

风里云里,我在这里等你!

文章评论(6)

  • 11

    自动化测试学习交流群:670250199

    2019年3月28日
  • 无名

    很重要的元素定位方法!感谢!

    2018年12月10日
    • Altumn

      微信公众号关注一波呗。

      2018年12月10日
  • 善良得阿呆

    学习了,多谢。

    2018年12月10日