目录
一、单数定位
二、复数定位
三、细讲xpath定位
3.1、xpath属性定位
3.2、xpath其他属性
3.3、文本属性
3.4、xpath标签
3.5、xpath层级
3.6、xpath索引
3.7、xpath逻辑运算
3.8、xpath模糊匹配
3.9、表格定位及参数化
3.10、在浏览器中调试xpath语法
四、css定位
五、js和jquery定位
1.通过id获取
2.通过name获取
3.通过标签名选取元素
4.通过CLASS类选取元素
5.通过CSS选择器选取元素
6.执行jquery(js)
六、其它定位
6.1、定位一组元素可用for循环取值
6.2、单选框和复选框
1.id 定位:find_element_by_id(self, id_)
2.name 定位:find_element_by_name(self, name)
3.class 定位:find_element_by_class_name(self, name)
4.tag 定位:find_element_by_tag_name(self, name)
5.link 定位:find_element_by_link_text(self, link_text)
6.partial_link 定位 find_element_by_partial_link_text(self,link_text)
7.xpath 定位:find_element_by_xpath(self, xpath)
8.css 定位:find_element_by_css_selector(self, css_selector)
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("乏善可陈")
driver.find_element_by_id("su").click()
driver.find_element_by_name("tj_trnews").click()
driver.find_element_by_class_name("s_ipt").send_keys("123456")
driver.find_elements_by_tag_name("input")[7].send_keys("123")
driver.find_element_by_link_text("贴吧").click()
driver.find_element_by_partial_link_text("hao1").click()
driver.find_element_by_xpath(".//*[@id='kw']").send_keys("YOYO课程")
driver.find_element_by_css_selector("#kw").send_keys("YOYO课程")
by元素定位
find_element()方法只用于定位元素。
它需要两个参数,第一个参数是定位方式,这个由By 提供;第二个参数是定位的值。
在使用By 时需要将By 类导入。
from selenium.webdriver.common.by import By
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
等等等
1.id 复数定位 find_elements_by_id(self, id_)
2.name 复数定位 find_elements_by_name(self, name)
3.class 复数定位 find_elements_by_class_name(self, name)
4.tag 复数定位 find_elements_by_tag_name(self, name)
5.link 复数定位 find_elements_by_link_text(self, text)
6.partial_link 复数定位 find_elements_by_partial_link_text(self, link_text)
7.xpath 复数定位 find_elements_by_xpath(self, xpath)
8.css 复数定位 find_elements_by_css_selector(self,css_selector)
返回的都是list数据类型,用ele[_index]方式定位某一个元素
xpath可通过id、name、class属性定位
#1.id定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("乏善可陈")
#2.class定位
#driver.find_element_by_xpath("//*[@class='lb']").click()
# #3.name定位
# driver.get("http://192.168.5.15:8018/Default.aspx") #公司内网
# time.sleep(2)
# driver.find_element_by_xpath("//*[@name='txtUserName']").send_keys("1111111")
也可通过元素中的其他属性定位
#5.其它属性
driver.find_element_by_xpath("//input[@autocomplete='off']").send_keys("222222")
文本属性无@符号
语法:.//*[text()=‘文本内容’] (重点掌握)
注意:除了这个文本属性匹配是.//*[text()=‘文本’]这种格式(无@)
其它的属性,如id,name,class等都是.//*[@id=‘xxx’] .//*[@name=‘xxx’]这种格式
#8.text()
driver.find_element_by_xpath("//*[text()='新闻']").click()
3.3.1、在使用标签定位时,在斜杆后添加标签名
3.3.2、不指定标签定位时,在斜杠后添加*号定位所有符合条件的标签
#tag定位(img标签)
driver.find_element_by_xpath("//img[@id='btnLogin']").click()
#符合条件的素有标签
driver.find_element_by_xpath("//*[@id='btnLogin']").click()
在元素属性不是很明确的情况下我们可以先定位导其父元素再选择元素
/ 寻找下一级元素, ..寻找父元素
#9.层级关系(根据父元素找子元素)
driver.find_element_by_xpath("//*[@id='wrap']/div/div/ul/li[3]").click()
driver.find_element_by_xpath("//*[@id='wrap']/div//li[3]").click()
#10.层级关系(根据子元素找父元素)
driver.find_element_by_xpath("//*[@id='news']/../../li[4]").click()
多个相同元素是同一个父元素,单数定位,可使用索引定位(索引从1开始,与Python中不同) eg://*[@id='wrap']/div//li[3]"
#6.索引
driver.get("https://www.sogou.com/")
driver.find_element_by_xpath("//*[@id='sf']/span[1]/input").send_keys("乏善可陈")
多个元素相同不是同一个父元素(Python中的索引定位,从0开始)
使用xpath复数定位,返回一个list,根据索引定位
driver.find_elements_by_xpath("//*[@name='txtUserName']")[0].send_keys("1111111")
1.xpath 还有一个比较强的功能,是可以多个属性逻辑运算的,可以支持与(and)、或(or)、非(not)
2.一般用的比较多的是 and 运算,同时满足两个属性
#7.多个属性组合
driver.find_element_by_xpath("//a[@id='news' and @uigs-id='nav_news']").click()
#11.模糊匹配(文字匹配)
driver.find_element_by_xpath("//*[contains(text(),'英文')]").click()
#12.模糊匹配(属性匹配)
driver.find_element_by_xpath("//*[contains(@id,'query')]").send_keys("1111111")
// 双斜杠 元素下的所有标签(多层) / 单斜杠 子元素(一层)
#参数化
x = 2
y = 3
xpathStr = "//*[@id='login-form']//tbody//tr[%s]/td[%s]/input" %(x,y)
driver.find_element_by_xpath(xpathStr).click()
#表格定位
driver.find_element_by_xpath("//*[@id='login-form']//tbody//tr[2]/td[1]/input").send_keys("11111111")
Firefox上的Firepath插件是调试xpath语法的最佳工具
注意:如果有iframe情况,左上角先切换到对应的iframe上
chrome自带的 F12之后,点开console
输入格式:$x(“xpath语法”) 然后回车
eg : $x(".//*[@name='email']")
#1.id选择器
driver.find_element_by_css_selector("#kw").send_keys("乏善可陈")
#2.class选择器
driver.find_element_by_css_selector(".s_ipt").send_keys("11111")
#3.标签
driver.find_element_by_css_selector("input").send_keys("不能实现,只练习语法")
#4.其他属性
driver.find_element_by_css_selector("[autocomplete='off']").send_keys("2222")
driver.find_element_by_css_selector("[name='wd']").send_keys("333333")
#5.同时满足多个元素(可用逗号隔开也可不用)
driver.find_element_by_css_selector("#kw,[class='.s_ipt'][name='wd']").send_keys("333333")
#6.子元素选择器
driver.find_element_by_css_selector("form>.bg.s_ipt_wr.quickdelete-wrap>input").send_keys("4444444")
#7.组合定位(多种定位类型)
driver.find_element_by_css_selector("#form.fm>span>#kw.s_ipt[autocomplete='off']").send_keys("5555555")
#8.:nth-child() 定位到一组数据取第几个
driver.find_element_by_css_selector("#u>a:nth-child(1)").click()
#9.后代元素选择器(空格隔开)
driver.find_element_by_css_selector("#form #kw").send_keys("6666666")
#10.毗邻元素选择器(+)
driver.find_element_by_css_selector(".bg.s_ipt_wr.quickdelete-wrap+span>input").click()
driver.back()
#11.同级元素选择器(~)
driver.find_element_by_css_selector(".bg.s_ipt_wr.quickdelete-wrap~span>input").click()
document.getElementById(“id”)----------获取的是单个
document.getElementsByName(“Name”)[0]---------获取的是多个返回的是list
document.getElementsByTagName(“tag”) --------获取的是多个返回的是list
document.getElementsByClassName(“class”) --------获取的是多个返回的是list
兼容性:IE8及其以下版本的浏览器未实现getElementsByClassName方法
document.querySelectorAll(“css selector")
兼容性:IE8及其以下版本的浏览器只支持CSS2标准的选择器语法
'''Jquery定位执行'''
driver.get("http://47.104.190.48:8088/zentao/user-login-L3plbnRhby8=.html")
time.sleep(1)
jq = '''
$("[name='account']").val("test123")
$("[name='password']").val("!@123456")
$("#submit").click()
'''
driver.execute_script(jq) #执行js语句
t = driver.find_elements_by_class_name("mnav")
for i in t:
print i.text
#1.定位单选框
driver.find_element_by_id("boy").click()
time.sleep(5)
driver.find_element_by_id("girl").click()
#2.定位复选框
#2.1选中一个
driver.find_element_by_id("c1").click()
time.sleep(5)
#2.2选多个选(第一个选中变取消)
check = driver.find_elements_by_xpath("//input[@type='checkbox']") #list类型不能直接点击
for i in check:
i.click()