二、selenium WebDriver元素定位方式以及通过谷歌Google 火狐Firefox 定位xpath 和css

定位方式:

id

name

class name

tag name

link text

partial link text

xpath

css selector

1. id定位:find_element_by_id("id值");id属性是唯一的

from selenium import webdriver
driver =webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("wd").send_keys("selenium")

2. name定位:元素的名称,find_element_by_name("name值");name属性值在当前页面可以不唯一

from selenium import webdriver
driver = webdriver.Chrome(
driver.get(r'https://www.baidu.com/')
driver.find_element_by_name('wd').send_keys('selenium')
 

3. class定位:元素的类名,find_element_by_class_name("class值")

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
driver.find_element_by_class_name('s_ipt').send_keys('selenium')

4. tag定位:页面html文档下的各种标签,find_element_by_tag_name("input");

tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。

任意打开一个页面,都会发现大量的<div>、<input>、<a>等tag,所以tag name定位很少用

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')

driver.find_element_by_tag_name('input').send_keys('selenium')   ## 通过tag定位不建议,每个网页tag居多,没意义

 

5. link定位:专门用来定位文本链接,find_element_by_link_name("text");

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_link_text('新闻').click()

通过text()这个XPath中的函数也可以达到类似link text定位的目的。

这个“新闻”链接元素的XPath表达式可以这样写://*/div[@id='u1']/a[text()='新闻']

driver.find_element_by_xpath("//*/div[@id='u1']/a[text()='新闻']").click()

//*/div[@id='u1']/a[text()='新闻']

6. partial link定位:是对link定位的一种补充,当链接上的文本内容比较长的时候,可以取文本的一部分进行定位,当然这部分可以唯一地标识这个链接

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_partial_link_text('地').click()

注:以上的方式稍有局限,且经常页面没有id,name这些属性值,class name重复性较高,link定位有针对性,

所以Xpath与Css定位更灵活些。

7. XPath定位:find_element_by_xpath("");有多种定位策略,用FirePath插件自动生成的涵盖以下几种方式

  ①绝对路径定位:对于没有id,name、classname不好定位的,这也是我最常用的,因为可以通过Firefox的FirePath插件可以方便的获取到xpath值

  ②利用元素属性定位:

  find_element_by_xpath(".//*[@id='Title']"),这里是用的id,也可以用元素其他能够唯一标识的属性,不局限于id、name、class这些;*代表的是标签名,不指定时就可以用*代替

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')

③XPath定位技巧之text()方法

以百度首页右上角“新闻”定位举例

XPath如下图

④XPath定位技巧之contains()方法

      有时候,我们不喜欢写很长的XPath表达式,而且节点信息里面,有些信息是动态的,每次都获取都不一样,这个时候contains()方法就很好用。

JD首页左侧电脑菜单举例

⑤XPath写法推荐,这里用contains()方法来定位

这里href = //diannao.jd.com, 如果我觉得这个href太长,我只取关键字diannao,利用contains()方法来定位就方便多了,推荐电脑这个元素的XPath://*/a[contains(@href,'diannao')]

⑥相对XPath路径写法

      有时候,我们遇到目标元素节点的信息很少,不足够用来精确定位到目标元素,这个时候,我们就需要考虑,利用目标元素上下附件节点,通过确定附件的节点从而确定目标元素,这种方式就叫相对路径。

这里用百度新闻首页的一个单选按钮来举例;

火狐浏览器上firepath给出的推荐表达式是:

这里推荐的XPath是根据目标元素节点中id信息来定位的,这个通过id就能定位,当然好。有时候,如果这个id不能作为参考值,我们需要利用相对定位方法来定位这个新闻标题前面的单选按钮;

1)先根据for = newstitle 或者text()=新闻标题来定位“新闻标题”这个标签。

2)根据相对定位来确定“新闻标题”前面的这个radio按钮。

3)XPath的写法是:.//*/label[@for='newstitle']/../input[@id='newstitle']
 

8. CSS定位(薄弱,用的很少,但很强大,比xpath简洁灵活):使用选择器来为页面元素绑定属性,可以灵活地选择控件的任意属性;

 1)通过class属性定位:点号(".")表示通过class属性定位driver.find_element_by_css_selector(".u-btn.mart5").click()

  2)通过id属性定位:("#")表示通过id定位元素

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(r'https://www.baidu.com/')
driver.find_element_by_css_selector('#kw').send_keys('selenium')

  3)通过其他属性定位:("[]"),中括号里的属性可以唯一标识这个元素就可以;属性的值可以加引号,也可以不加 

driver.find_element_by_css_selector("[type=submit]").click()

这里用浏览器谷歌火狐的开发者工具可以实现xpath定位 、CSS定位 

浏览器按F12

 

 

By定位
通过对上面8种基本元素定位方式的学习,在使用过程种可以根据实际的情况去选择对应的的定位方式,我们可以用By来设置定位策略,具体语法如下:

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su") 

上面这些使用的前提是需要导入By类:from selenium.webdriver.common.by import By 
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值