[译]Selenium Python文档:三、导航控制
你使用WebDriver要做的第一件事就是访问一个链接。一般通过调用get方法来实现:
driver.get("http://www.baidu.com")
在将控制权返给你的脚本之前WebDriver将会等待Web页面完全加载(也就是说,等待onload被触发)。值得注意的是如果你的页面在加载的时候使用了大量的AJAX的话,WebDriver可能不知道什么时候页面已经加载完成。如若你需要确保这类页面被完整加载,可以使用wait等待。
3.1.与页面进行交互
仅仅访问一个页面并没什么大用处。我们真正想做的是和页面进行交互,或者更专业一点的说,和页面中的HTML元素进行交互。首先,我们需要先定位一个页面元素。WebDriver为定位页面元素提供了大量方法。例如,像下面这样定义一个HTML 元素:
<input type="text" name="passwd" id="passwd-id" />
你可以使用下面的任意一种方法定位它:
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
你也可以通过他的显示文本来定位它。但是请小心——文本必须完全匹配!使用WebDriver XPath的时候也应当格外小心。如果通过查询语句匹配了多个元素,只有第一个会被返回。如果没有找到匹配的,将会抛出一个NoSuchElementException异常。
WebDriver是面向对象的;针对不同元素我们使用相同的接口。这意味着,你的IDE自动补全功能会给你提示很多方法,但他们并不都是有效的,有些使用的话甚至会出错。别太担心!WebDriver将会尝试去做正确的处理。如果你调用了一个无意义的方法(如,对一个“meta”元素进行“setSelected()”操作),WebDriver将会抛出一个异常。
嗯哼,你现在得到了一个元素。你能对他做什么呢?首先,你也许想要在文本输入框中输入一些文本:
element.send_keys("some text")
你可以使用Keys类来模拟敲下-箭头按键:
element.send_keys(" and some",Keys.ARROW_DOWN)
可以对任意的HTML 元素调用send_keys方法,这可以用来测试键盘快捷键,就像GMAIL中使用的那样。这样做的一个副作用是在文本输入框中键入什么的时候不会自动清除它先前的内容,而是直接将你的内容追加到后面。但是你可以使用clear轻松清除掉文本输入框或者文本域的内容:
element.clear()
3.3.填写Form表单
我们已经知道了如何在文本输入框和文本域中输入文字,其他元素又怎么样呢?你可以切换下拉的状态,你可以使用setSelected将OPTION标签的元素设置为选中状态,处理SELECT标签也不错:
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
print("Value is: %s" % option.get_attribute("value"))
option.click()
这将会找到页面上的第一个SELECT元素,循环遍历OPTIONS,打印出它们的值,并选中它们。
正如你所看到的那样,这不是处理SELECT元素最高效的方法。WebDriver中有一个Select类,提供了处理SELECT相关的高效方法:
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
WebDriver还提供了取消选中的功能:
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options
获得所有的可用选项:
options = select.options
一旦你完成了表单的填写,你应该会想提交它。一种方法是找到submit按钮并点击它。
# 假设按钮的ID是"submit" :)
driver.find_element_by_id("submit").click()
除此之外,WebDriver还为每一个元素的提交行为提供了一个简便的方法。如果你对一个表单内的元素调用此方法,WebDriver将会遍历整个DOM直到找到闭合的form标签,并对其调用提交(submit)。如果这个元素不是一个表单,将会抛出一个NoSuchElementException异常:
element.submit()
3.3.拖拽
你可以使用拖拽功能移动元素:
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
3.4.在窗口和帧之间移动
现代Web应用多是多帧的,很少有单一窗口的了。WebDriver提供了switch_to_window方法来支持命名窗口间的移动切换:
driver.switch_to_window("windowName")
现在driver的所有操作将会针对特定的窗口。但是怎么才能知道窗口的名字呢?看一下js或者html中的超链接:
<a href="somewhere.html" target="windowName">Click here to open a new window</a>
或者你可以给switch_to_window方法传递一个“窗口句柄”。这样我们就可像下面这样遍历每一个窗口的标签:
for handle in driver.window_handles:
driver.switch_to_window(handle)
你也可以在帧与帧之间切换(或者iframe之间)
driver.switch_to_frame("frameName")
通过点号分割的路径可以访问子帧,你也可以通过索引指定具体的帧:
driver.switch_to_frame("frameName.0.child")
上边的代码将会进入第一个名为"frameName"的->第一个子帧->的一个名为"child"的子帧。All frames are evaluated as if from top.
我们一旦结束了在frame上的工作,可以返回父帧:
driver.switch_to_default_content()
3.5.弹出式对话框
Selenium WebDriver对处理弹出式对话框提供了内建支持。你触发了相应操作之后将会打开一个弹框,你可以像下面这样访问alert:
alert = driver.switch_to_alert()
这将会返回当前打开的alert对象。通过这个对象你可以进行确认同意,反对,读取它的内容甚至输入一些东西。这个接口对于处理alerts、confirm、prompts同样棒
[译]Selenium Python文档:三、导航控制的更多相关文章
- [译]Selenium Python文档:目录
作者:Baiju Muthukadan 协议:本文档采用知识共享署名 - 共享4.0国际许可. 原英文网址:http://selenium-python.readthedocs.io/index.ht ...
- [译]Selenium Python文档:一、安装
1.1.简介 Selenium Python为使用Selenium WebDriver来编写功能/验证测试提供了一个简单的API接口.通过Selenium Python API,你可以以一种非常直观的 ...
- [译]Selenium Python文档:四、元素定位
要定位一个页面中的元素有多中策略和方法.你可以根据实际情况选择其中最为合适的.Selenium为定位页面元素提供了下面的这些方法: find_element_by_id(使用id) find_elem ...
- [译]Selenium Python文档:八、附录:FAQ常见问题
另外一个FAQ:https://github.com/SeleniumHQ/selenium/wiki/Frequently-Asked-Questions 8.1.怎样使用ChromeDriver ...
- [译]Selenium Python文档:七、WebDriver API接口
由于API文档格式不太适合cnblog博客,暂且翻译一部分,且暂未校对 注意:这不是官方文档,官方 API文档在这里. 本章包含Selenium WebDriver的所有接口 推荐import风格 本 ...
- [译]Selenium Python文档:二、初步开始
2.1.简单使用 如果已经安装好了Selenium Python,你就可以像下面这样编写Python代码来使用它了: from selenium import webdriver from selen ...
- [译]Selenium Python文档:五、Waits等待
大多数现代web应用都使用了AJAX技术.当浏览器加载一个页面的时候,该页面内的元素可能在不用的时间间隔内进行加载.这使得元素定位变得比较困难:如果一个元素还没有出现在DOM中,定位函数将会抛出一个E ...
- [译]Selenium Python文档:六、页面对象
本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...
- 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级
SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...
随机推荐
- 记录UITextField删除状态
self.testTextField.leftView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; self.testTextField. ...
- 5天2亿活跃用户,QQ“LBS+AR”天降红包活动后台揭密
作者:Dovejbwang,腾讯后台开发工程师,参与“LBS+AR”天降红包项目,其所在“2016春节红包联合项目团队”获得2016公司级业务突破奖. 商业转载请联系腾讯WeTest获得授权,非商业转 ...
- Angular企业级开发(7)-MVC之控制器
1.MVC中的控制器 AngularJS的控制器主要为了把模型和视图连接在一起.大多数业务逻辑操作都会放在视图对应的控制器中.当然如果我们能够把业务逻辑放到后端的REST服务中,就可以开发轻量级Ang ...
- 如何写好 Git commit messages
导语:任何软件项目都是一个协作项目,它至少需要2个开发人员参与,当原始的开发人员将项目开发几个星期或者几个月之后,项目步入正规.不过他们或者后续的开发人员仍然需要经常提交一些代码去修复bug或者实现新 ...
- 使用jmeter进行APP接口测试经验总结
声明:我觉得文章不错想保存,如果带来不便请联系我. 使用工具: Fiddler.Jmeter 测试步骤: 1. 确认接口 从开发人员那里获取接口文档,接口文档应该包括完整的功能接口.接口请求方式 ...
- 几分钟看完 flow.ci 全部功能
从 0 到 1,从邀请式内测到收费上线,flow.ci 经历了十个多月的沉淀与打磨.这期间,flow.ci 工程师们奋力赶工,进行了一系列的大功能更新,Bug 修复,功能优化. 这篇文章记录了 flo ...
- C++测试利器--google test开源测试框架
资料 偶然发现了google的测试框架gtest,马上试了下,效果挺不错,特别是对于写c++的人来说,方便很多.以前自己写c++的模块,通常是写好了模块后再另外定义些函数,然后在函数里面写测试用例来测 ...
- (译文)Python中的staticmethod与classmethod
原文是stackoverflow的一则高票回答,原文链接 可能之前也有人翻译过,但是刚好自己也有疑惑,所以搬运一下,个人水平有限所以可能翻译存在误差,欢迎指正(如侵删). 尽管classmethod和 ...
- Javascript匿名函数
单独的匿名函数无法运行,就算能运行,也无法调用.解决办法如下: 法1. //把匿名函数赋值给变量 var box=function(){ return "Lee"; }; aler ...
- 存储过程与SQL语句如何选择
58到家数据库30条军规,有一条是“禁止使用存储过程.视图.触发器.Event”, 高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”, 并发量大的情况下,这些功能很可能 ...