一个简单的脚本
元素的定位
注意:不管用那种方式,必须保证页面上该属性的唯一性
webdriver 提供了一系列的对象定位方法,常用的有以下几种
id
name
class name
link text
partial link text
tag name
xpath
css selector
例如:一个百度的输入框,可以用这么用种方式去定位(以下是html代码)
<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
脚本代码:
#coding=utf-8 from selenium import webdriver import time browser = webdriver.Chrome() browser.get("http://www.baidu.com") #########百度输入框的定位方式########## #通过id 方式定位 browser.find_element_by_id("kw").send_keys("selenium") #通过name 方式定位 browser.find_element_by_name("wd").send_keys("selenium") #通过tag name 方式定位 browser.find_element_by_tag_name("input").send_keys("selenium") 不能成功,因为input太多了不唯一。 #通过class name 方式定位 browser.find_element_by_class_name("s_ipt").send_keys("selenium") #通过CSS 方式定位 browser.find_element_by_css_selector("#kw").send_keys("selenium") #通过xphan 方式定位 browser.find_element_by_xpath("//*[@id='kw']").send_keys("selenium") ############################################ browser.find_element_by_id("su").click() time.sleep(3) browser.quit()
id和name定位
id 和name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id 和name 命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易。
我们通过前端工具,例如chrome的F12,找到了百度输入框的属性信息,如下:
<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
id=”kw”
通过find_element_by_id("kw") 函数就是捕获到百度输入框
name=”wd”
通过find_element_by_name("wd")函数同样也可以捕获百度输入框
tag name 和 class name定位
从上面的百度输入框的属性信息中,我们看到,不单单只有id 和name 两个属性,
比如class 和tag name(标签名)
input 就是一个标签的名字,可以通过find_element_by_tag_name("input") 函数来定位。
class="s_ipt",通过find_element_by_class_name("s_ipt")函数捕获百度输入框。
CSS定位
CSS(Cascading Style Sheets)是一种语言,它被用来描述HTML 和XML 文档的表现。
CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略。
CSS 的比较灵活可以选择控件的任意属性,上面的例子中:
find_element_by_css_selector("#kw")
通过find_element_by_css_selector( )函数,选择取百度输入框的id 属性来定义
CSS的获取可以用chrome的F12开发者模式中Element-右键-copy-copy selector来获取
XPath定位
XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。
XPath 扩展了上面id 和name 定位方式,提供了很多种可能性。
XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取
如:find_element_by_xpath("//*[@id='kw']")
link text 定位
有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link
#coding=utf-8 from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.baidu.com") browser.find_element_by_link_text("hao123").click() browser.quit()
Partial link text
定位通过部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例子,我可以只用链接的一部分文字进行匹配:
#coding=utf-8 from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.baidu.com") browser.find_element_by_partial_link_text("hao").click() browser.quit()
操作测试对象
前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个原素进行操作。鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。
一般来说,webdriver 中比较常用的操作对象的方法有下面几个:
- click 点击对象
- send_keys 在对象上模拟按键输入
- clear 清除对象的内容,如果可以的话
- submit 清除对象的内容,如果可以的话
- text 用于获取元素的文本信息
鼠标点击与键盘输入
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") time.sleep(2) driver.find_element_by_id("kw").send_keys("test") time.sleep(2) driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("selenium") time.sleep(2) #通过submit() 来操作 driver.find_element_by_id("su").submit() time.sleep(3) driver.quit()
send_keys("xx") 用于在一个输入框里输入xx 内容。
click() 用于点击一个按钮
clear() 用于清除输入框的内容,比如百度输入框里默认有个“请输入关键字”的信息,再比如我们的登陆框一般默认会有“账号”“密码”这样的默认信息,clear 可以帮助我们清除这些信息。
submit提交表单
把“百度一下”的操作从click 换成submit 可以达到相同的效果:
driver.find_element_by_id("su").submit()
text 获取元素文本
text 用于获取元素的文本信息
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") time.sleep(2) #id = cp 元素的文本信息 data=driver.find_element_by_id("cp").text print data #打印信息 time.sleep(3) driver.quit()
输出:
©2018 Baidu 使用百度前必读 意见反馈 京ICP证030173号
添加等待
添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了
import time time.sleep(3)
智能等待
通过添加implicitly_wait() 方法就可以方便的实现智能等待;implicitly_wait(30)的用法应该比time.sleep() 更智能
后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
# coding = utf-8 from selenium import webdriver import time #调入time 函数 browser = webdriver.Chrome() browser.get("http://www.baidu.com") browser.implicitly_wait(30) #智能等待30秒 browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() browser.quit()
两种等待的共同点:
等待够设置的时间,如果下一句执行的代码需要的元素没加载出来,都会抛出异常
打印信息
打印tile及url
#coding = utf-8 from selenium import webdriver driver = webdriver.Chrome() driver.get('http://www.baidu.com') print driver.title # 把页面title 打印出来 print driver.current_url #打印url driver.quit()
虽然没看到脚本的执行过程,但在执行结果里看到了
这说明页面正确被打开了
浏览器的操作
浏览器最大化
我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。
#coding=utf-8 from selenium import webdriver import time browser = webdriver.Chrome() browser.get("http://www.baidu.com") print "浏览器最大化" browser.maximize_window() #将浏览器最大化显示 time.sleep(2) browser.find_element_by_id("kw").send_keys("selenium") browser.find_element_by_id("su").click() time.sleep(3) browser.quit()