《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情

网页元素定位和操作

阅读:296357611    分享到

大家仔细思考一下,我们用 selenium 操控浏览器是什么意思,其实就是用 selenium 模拟人上网,也就是说人用浏览器能做的任何事情,我们用 selenium 都可以做,selenium 就如一个会上网的机器人一样。

上节课我们只是简单的学习了用 selenium 打开浏览器并做了对浏览器做了一些简单的操作,大家要知道,我们上网更重要的是对网页做操作,也就是对网页中的控件做操作,想对这些控件做操作,首先,我们就需要先找到它们。

selenium 定位方法

Selenium 提供了 8 种定位方式。

  • id
  • name
  • class name
  • tag name
  • link text
  • partial link text
  • xpath
  • css selector

这8种定位方式在 Python selenium 中所对应的方法为:

  • find_element_by_id()
  • find_element_by_name(),find_elements_by_name()
  • find_element_by_class_name(),find_elements_by_class_name()
  • find_element_by_tag_name(),find_elements_by_tag_name()
  • find_element_by_link_text(),find_elements_by_link_text()
  • find_element_by_partial_link_text(),find_elements_by_partial_link_text()
  • find_element_by_xpath(),find_elements_by_xpath()
  • find_element_by_css_selector(),find_elements_by_css_selector()

我们发现除了根据 id 定位之外,剩下的 7 中方法都提供两个函数,两个函数唯一的区别是在单词 element 后面多了一个 s 表示复数,带 s 的函数是定位一组元素的写法(也就是找到符合条件的所有元素,结果为一个数组)。因为网页中元素的 id 是唯一的(当然如果你非要多个元素同用一个 id 名,只有第一个元素的 id 有效),所以没有 find_elements_by_id 这种查找方法。

定位方法的用法

假如我们有一个 Web 页面,通过前端工具(按 F12)查看到一个元素的属性是这样的,我们现在使用以上 8 种方法去查找元素,我们用单一元素定位的函数,对于一组元素定位的函数使用,大家自行写代码做实验。

<html>
<head>
<body link="#0000cc">
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
<a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">
<form id="form" class="fm" name="f" action="/s">
  <span class="soutu-btn"></span>
  <input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

我们的目的是要定位 input 标签的输入框。

dr.find_element_by_id("kw")    # 通过 id 定位
dr.find_element_by_name("wd")  # 通过name定位
dr.find_element_by_class_name("s_ipt")  # 通过class name定位
dr.find_element_by_tag_name("input")    # 通过tag name定位

'''
通过 xpath 定位,xpath 定位有N种写法,这里列几个常用写法
'''
dr.find_element_by_xpath("//*[@id='kw']")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@class='soutu-btn']/input")
dr.find_element_by_xpath("//form[@id='form']/span/input")
dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")

'''
通过 css 定位,css 定位有N种写法,这里列几个常用写法
'''
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")

接下来,我们根据页面上的 a 标签的链接文本进行定位。

dr.find_element_by_link_text("新闻")    # 通过 link text 定位
dr.find_element_by_link_text("hao123")  # 通过 link text 定位

dr.find_element_by_partial_link_text("新")   # 通过 link text 部分内容定位
dr.find_element_by_partial_link_text("hao")  # 通过 link text 部分内容定位
dr.find_element_by_partial_link_text("123")  # 通过 link text 部分内容定位

输入和点击

我们已经学习了定位元素,定位只是第一步,定位之后需要对这个元素进行操作,或单击(按钮)或输入(输入框),下面就来认识 WebDriver 中最常用的几个方法:

from selenium import webdriver

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

driver.find_element_by_id("kw").clear()  # 清除文本
driver.find_element_by_id("kw").send_keys("selenium")  # 模拟按键输入
driver.find_element_by_id("su").click()  # 单击元素

driver.quit()

提交

submit()方法用于提交表单。例如,在搜索框输入关键字之后的“回车” 操作,就可以通过该方法模拟。

from selenium import webdriver

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

search_text = driver.find_element_by_id('kw')
search_text.send_keys('selenium')
search_text.submit()

driver.quit()

注意:有时候 submit() 可以与 click() 方法互换来使用,submit() 同样可以提交一个按钮,但 submit() 的应用范围远不及 click() 广泛。

其他常用方法

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

# size 属性:获得输入框的尺寸
tagsize = driver.find_element_by_id('kw').size
print(tagsize)    # 输出:{'width': 500, 'height': 22}

# text 属性:获取元素的文本
tagtext = driver.find_element_by_id("cp").text
print(tagtext)    # 输出:©2015 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173 号

# get_attribute(name) 方法:返回元素的属性值,可以是 id、 name、 type 或其他任意属性
attribute = driver.find_element_by_id("kw").get_attribute('type')
print(attribute)  # 输出:text

# is_displayed() 方法:返回元素的结果是否可见,返回结果为 True 或 False
result = driver.find_element_by_id("kw").is_displayed()
print(result)     # 输出:True

driver.quit()

执行上面的程序并查看结果:size 方法用于获取百度输入框的宽、高;text 方法用于获得百度底部的备案信息;get_attribute() 用于获得百度输入的 type 属性的值;is_displayed() 用于返回一个元素是否可见,如果可见则返回 True,否则返回 False。


如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
DCjanus
2020年1月18日 14:02 回复

很全面,学习了


user_image
范德林德第一劳模
2019年5月8日 10:50 回复

很好!目前大三,在实习都是手动的功能测试。看了文章觉得很不错,决定一直追下去了。


user_image
木大木大
2019年4月27日 14:31 回复

chrome 浏览器,右键有 xpath 定位语法,很好用


user_image
dummy
2019年3月4日 12:52 回复

最近正在学Selenium,正好赶上了,顺便表示,沙发


user_image
大蚂蚁
2018年11月16日 20:54 回复

请问一下id动态元素怎么定位


user_image
黍离
2018年12月5日 17:55

一般来说都有自己的规律,归在某个表下啊,某个class啊。如果实在没有,就把所有大标签提取出来,过滤id


user_image
多年微软MVP
2018年8月27日 08:42 回复

有些隐藏的元素,不知道怎么定位,有学习或讨论*之类的吗?


user_image
活在当下
2018年8月7日 04:07 回复

写的很棒,决定一直追下去


user_image
砍掉重练
2018年7月30日 02:53 回复

感谢您的文章。


user_image
t123yh
2018年4月7日 06:29 回复

占楼,点赞