selenium.webdriver提供了所有WebDriver的实现,目前支持FireFox、phantomjs、Chrome、Ie和Remote
安装seleniun
新建实例driver = webdriver.Chrome()
通过标签属性Id查找元素
方法:find_element_by_id(element_id)
实例:driver.find_element_by_id(“iptUsername”)
通过标签属性name查找元素
方法:find_element_by_name(element_name)
实例:driver.find_element_by_name(“inputPwname”)
通过标签Xpath路径查找元素
方法:find_element_by_xpath(xpath)
实例:
通过标签名tagname查找元素
方法:find_element_by_tag_name(tag_name)
实例:driver.find_element_by_tag_name(“input”)
注意:通过tag_name查找时使用find_element_by_tag_name查找到的是第一个标签的tag_name
返回元素的tagName
方法:tag_name
实例:driver.find_element_by_id(“iptUsername”).tag_name
通过标签中的元素文本链接查找元素
方法:find_element_by_link_text(link_text)
实例:driver.find_element_by_link_text(‘登 录’)
通过查找部分链接文件匹配元素
实现
通过标签的class属性查找元素
方法:find_elements_by_class_name(class_name)
实例:driver.find_elements_by_class_name(“x-panel-body”)
通过css样式查找元素
方法:find_element_by_css_selector()
实例:driver.find_element_by_css_selector(“input.btn”)
温馨提示:find_elements_by_css_selector()查询到的是一个集合,如果id名字重复的时候可以采取find_elements_by_id(),其他的查询方式同理;
通过CSS的定位策略。默认情况下本机浏览器支持CSS定位,所以,请参考W3C CSS选择器http://www.w3.org/TR/CSS/#selectors显示一般可用的CSS选择器的列表。如果浏览器没有原生支持CSS查询,可以使用Sizzle(Sizzle是一个纯javascript CSS选择器引擎)。目前,IE 6,7和FF3.0使用Sizzle的CSS查询引擎。
注意:不是所有浏览器对CSS的支持都是一样的,可能在一个浏览器中运行良好,切换到另一个浏览器则不然。
不同驱动的支持
在高的级别上,尽可能的使用一个浏览器原生的webdriver XPath 的功能。在一些没有本地的XPath支持的浏览器,我们已经提供了我们自己的实现。这可能会导致一些意想不到的行为,除非你知道各种XPath引擎的差异。
这点抽象,对于下面这段HTML 代码来说:
不同驱动对大小写的支持:
HTML元素有时并不需要显式地声明,因为他们默认为已知值的属性。例如,“input”的标签并不需要的“type”属性,因为它默认为“text”。webdriver使用XPath时,你不应该期望能够对这些隐含的属性相匹配。
返回当前会话中的cookies
方法:get_cookies()
实例:driver.get_cookies()
根据cookie name 查找
方法:driver.get_cookie(cookie_name)
实例:driver.get_cookie(“NET_SessionId”)
删除浏览器所有的cookies
方法:delete_all_cookies()
实例:driver.delete_all_cookies()
删除指定的cookie
方法:delete_cookie(name)
实例:deriver.delete_cookie(“my_cookie_name”)
例子:
**获取当前窗
口的坐标**
方法:get_window_position()
实例:driver.get_window_position()
获取当前窗口的长和宽
方法:get_window_size()
实例:driver.get_window_size()
获取元素坐标
方法:location
解释:首先查找到你要获取元素的,然后调用location方法
实例:
返回元素的大小
方法:size
实例:driver.find_element_by_id(“iptPassword”).size
返回值:{‘width’: 250, ‘height’: 30}
获取CSS的属性值
方法:value_of_css_property(css_name)
实例:
- 获取元素的属性值
方法:get_attribute(element_name)
实例:
获取标签中的文本值
获取元素的文本值
方法:text
实例:driver.find_element_by_id(“iptUsername”).text
有些时候,我们需要再页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们可以通过导入 ActionChains 类来做到:
表单的提交
方法:submit
解释:查找到表单(from)直接调用submit即可
实例:driver.find_element_by_id(“form1”).submit()
我们已经知道了怎样向文本框中输入文字,但是有时候我们会碰到标签的下拉框。直接点击下拉框中的选项不一定可行。
Selenium 专门提供了 Select 类来处理下拉框。
其实 WebDriver 中提供了一个叫 Select 的方法,可以帮助我们完成这些事情:
以上是三种选择下拉框的方式,它可以根据索引来选择,可以根据值来选择,可以根据文字来选择。注意:
用户输入-填写表单
我们已经看到了如何将文字输入到一个文本或文本字段,但其他元素?您可以“切换”复选框的状态,你可以使用“点击”设置类似选择的选项标记。处理SELECT标签是不是太糟糕:
找到页面上第一个“select”的元素,并通过每个选项依次循环,打印出它们的值。你会发现,这不是最有效处理SELECT元素的方式。在webdriver的支持类中,有一个名为“select”,它提供了一些有用的方法,来处理这些交互。
从页面上第一个选择开始取消所有选项,从第一个选择页面上的所有选项,然后选择显示的文本与“Edam” 的选项。
当你完成填写表格,你可能要提交。我们需要找到“提交”按钮,然后单击它:
另外,有方便的方法可以在webdriver的每个元素上的“提交”。如果调用此表单内的元素,webdriver通过的DOM按顺序找到封闭的形式,然后调用该提交。如果该元素不是一种形式,那么会抛出NoSuchElementException异常:
如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难,
如果因为在加载某个元素时延迟而造成ElementNotVisibleException(不可见元素异常)的情况出现,那么就会降低自动化脚本的稳定性,设置元素等待可改善这种问题造成的不稳定。
Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。
隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行。
显式等待
显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。
如果不写参数,程序默认会 0.5s 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions).until()
- driver:浏览器驱动
- timeout:最长超时时间,默认以秒为单位
- poll_frequency:检测的间隔(步长)时间,默认为0.5S
- ignored_exceptions:超时后的异常信息,默认情况下NoSuchElementException
WebDriverWait()一般由until()或until_not()方法配合使用,下面是方法说明
- until(method,message=’’):调用该方法提供的驱动程序作为一个参数,直到返回值为True
- until_not(method,message=’’):调用该方法提供的驱动程序作为一个参数,直到返回值为False
- presence_of_all_elements_located():判断元素是否存在
下面是一些内置的等待条件,你可以直接调用这些条件,而不用自己写某些等待条件了。
title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable – it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present
隐式等待
方法:implicitly_wait(wait_time)
实例:driver.implicitly_wait(30)
通过一定的时长等待页面上某元素加载完成,如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常,WebDriver
隐式等待比较简单,提供了implicitly_wait()方法来实现隐式等待,默认设置为0,单位为秒。
sleep休眠方法
在脚本执行中固定休眠
浏览器中加载url
方法:get(url)
实例:driver.get(“http//:www.baidu.com”)
获取当前页面的Url函数
方法:current_url
实例:driver.current_url
获取当前页面的html
实例:driver.page_source
获取某个元素的html信息
page_source属性,但是那个是获取整个网页的html而不是元素的html
通过 get_attribute(‘innerHTML’)的方式可以获取某个元素的html信息
实例:driver.find_element_by_id(‘tb-37327761306’).get_attribute(‘innerHTML’)
关闭页面
方法:close()
实例:driver.close()
close()方法只是关闭页面,但如果只有一个页面被打开,close()方法同样会退出浏览器
关闭浏览器并且推出驱动程序
方法:quit()
实例:driver.quit()
浏览器窗口最大化
方法:maximize_window()
实例:driver.maximize_window()
查看浏览器的名字
方法:name
实例:drvier.name
向前
方法:forward()
实例:driver.forward()
返回上一页
方法:back()
实例:driver.back()
截取当前页面
方法:get_screenshot_as_file(filename)
实例:driver.get_screenshot_as_file(“D:Program FilesPython27NM.bmp”)
判断元素是否被选中
方法:is_selected()
实例:driver.find_element_by_id(“form1”).is_selected()
判断元素是否显示
方法:is_displayed()
实例:driver.find_element_by_id(“iptPassword”).is_displayed()
判断元素是否被使用
方法:is_enabled()
实例:driver.find_element_by_id(“iptPassword”).is_enabled()
元素赋值
方法:send_keys(*values)
实例:driver.find_element_by_id(“iptUsername”).send_keys(‘admin’)
注意如果是函数需要增加转义符u,eg.
driver.find_element_by_id(“iptUsername”).send_keys(u’青春’)
键盘输入enter
弹窗处理
当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:
这将返回当前打开的警报对象。有了这个对象,你现在可以接受,拒绝,读取其内容,甚至类型会得到一个提示。这个接口同样适用警告,确认和提示。参考到的JavaDoc 或RubyDocs的更多信息。
页面切换
一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。
切换窗口的方法如下:
也可以使用 window_handles 方法来获取每个窗口的操作对象。例如:
框架(frames)切换
从frames到frames(或到iframe中):
访问子frames由一个圆点分隔的路径,并且可以通过其索引指定frames。是:
使用Javascript
你可以执行任意javascript来找到一个元素,只要你返回一个DOM元素,它将自动转换为一个WebElement对象。
简单的例子,在页面上加载了jQuery:
在页面上的每一个标签查找所有输入元素:
如何模拟手机访问?
示例演示: