Python Selenium如何定位元素

Python Selenium教程 2019-01-06 0:16:01 阅读(11102) 评论(2)

上一篇文章我们写了一个简单的演示程序,完整演示了如何打开浏览器,访问网页,点击链接,向输入框输入文字。点击链接和输入框我们是靠定位html元素来实现,定位元素是实现Selenium跟页面交互(点击,输入行为)的最主要手段,这篇文章就是主讲Selenium定位元素的几种方法。

selenium定位元素

官方给了八种定位方法,一个一个的来介绍用法。

1.find_element_by_class_name通过class name定位元素

我们拿猿人学网站来举例,目的是把页面右上角的搜索框点出来。

猿人学 search class name
猿人学search show

鼠标右击搜索图标,然后选择检查,可以看到搜索图标的a标签的class name是search-show.

开发者工具a标签

所以find_element_by_class_name方法里的参数就填search-show:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.cn')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

2.find_element_by_id通过id定位元素

接着上面的例子,我们要在输入框中输入Python教程几个字,继续鼠标右击输入框,选择检查,看到input标签的id是isearch

input框的id值

所以find_element_by_id方法里填入isearch:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.cn')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

search = driver.find_element_by_id("isearch")
search.send_keys(u'python教程')

看代码流程是先点搜索图标,弹出搜索框后,才在输入框里输入的,你用肉眼在浏览器上看不见的东西,直接去定位元素会报错的,会报element not visible错误,必须先点击它的上层元素,把它暴露出来后,才能定位得到。

3.find_element_by_tag_name通过html tag定位

上面在搜索框里输入字符我们也可以通过定位html tag来实现,输入框的tag是input,所以代码如下:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.cn')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

search = driver.find_element_by_tag_name("input")
search.send_keys(u'python教程')

一般不直接通过tag name定位,因为一个页面相同的html tag有很多,有可能会定位错误,我举得这个例子,刚好页面只有一个input输入框。

4.find_element_by_name通过name定位

还是拿上面输入框举例,使用上面的方法,右键元素-选检查步骤,可以看到input框的name是’s’。
所以代码是 find_element_by_name(‘s’),就不再像上面写完整的代码程序了。

5.find_element_by_css_selector通过css来定位

有时用上述方法定位元素很繁琐时,往往通过css来定位会很方便,我也常常使用css来定位。来看看操作方法,老规矩还是拿猿人学的搜索框来举例。我们右击搜索框选择检查,打开chrome的开发者工具,如图:

input框的css

右边标红处就是input框的css,’.search-input’,完整代码如下:

#coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.get('https://www.yuanrenxue.cn')
time.sleep(5)

driver.find_element_by_class_name('search-show').click()

search = driver.find_element_by_css_selector(".search-input")
search.send_keys(u'python教程')

另外,常常会有两个以上元素被定义的情况,比如这样的。

两个以上的css

需要把中间的空格去掉,写成这样:
.find_element_by_css_selector(“.m-page.next”)
三个四个以上的也是这种写法。

6.find_element_by_xpath通过xpath来定位

这种方法也是很适用,用上述方法难定位的就可以试试,前提是你明白xpath的用法,这里就不再叙述了。

7.find_elements_by_link_text通过文字链接来定位

这种方法是用来定位文字链接的,就是’‘标签括起来的文字。
比如我们要定位猿人学菜单栏上的Python教程,就这样写。

猿人学菜单
猿人学菜单html代码

find_element_by_link_text(u’Python教程’)

第八种方法就是在第七种方法基础上可以模糊匹配字符。find_elements_by_partial_link_text

在使用上面的方法定位元素时,都要能唯一定位才行,比如一个页面有几个相同的id,相同的class name等时,这时就可能定位到错误的元素上去,这时就要使用上述方法的复数来定位。
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
element后面多了一个s,会以列表的形式把定位到的相同元素全部返回,你要知道你需要的元素是第几个,通过数组下标来取对应的元素。

比如你要点击某个网站第三个链接,写法如下:
find_elements_by_tag_name(‘a’)[2].click()

Selenium定位元素的方法就写完了,还有一点说的就是,Selenium涉及到要操作字符串的地方,比如向输入框输入时,最好用unicode码。

猿人学banner宣传图

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***

说点什么吧...

  1. 1楼
    匿名 5年前 (2019-03-20)

    受用,感谢作者

    • 回复
      王平 5年前 (2019-03-20)
      回复 @ :Selenium还没写完呢,你可以持续关注,哈哈