你使用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表单

我们已经知道了如何在文本输入框和文本域中输入文字,其他元素又怎么样呢?你可以切换下拉的状态,你可以使用setSelectedOPTION标签的元素设置为选中状态,处理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文档:三、导航控制的更多相关文章

  1. [译]Selenium Python文档:目录

    作者:Baiju Muthukadan 协议:本文档采用知识共享署名 - 共享4.0国际许可. 原英文网址:http://selenium-python.readthedocs.io/index.ht ...

  2. [译]Selenium Python文档:一、安装

    1.1.简介 Selenium Python为使用Selenium WebDriver来编写功能/验证测试提供了一个简单的API接口.通过Selenium Python API,你可以以一种非常直观的 ...

  3. [译]Selenium Python文档:四、元素定位

    要定位一个页面中的元素有多中策略和方法.你可以根据实际情况选择其中最为合适的.Selenium为定位页面元素提供了下面的这些方法: find_element_by_id(使用id) find_elem ...

  4. [译]Selenium Python文档:八、附录:FAQ常见问题

    另外一个FAQ:https://github.com/SeleniumHQ/selenium/wiki/Frequently-Asked-Questions 8.1.怎样使用ChromeDriver ...

  5. [译]Selenium Python文档:七、WebDriver API接口

    由于API文档格式不太适合cnblog博客,暂且翻译一部分,且暂未校对 注意:这不是官方文档,官方 API文档在这里. 本章包含Selenium WebDriver的所有接口 推荐import风格 本 ...

  6. [译]Selenium Python文档:二、初步开始

    2.1.简单使用 如果已经安装好了Selenium Python,你就可以像下面这样编写Python代码来使用它了: from selenium import webdriver from selen ...

  7. [译]Selenium Python文档:五、Waits等待

    大多数现代web应用都使用了AJAX技术.当浏览器加载一个页面的时候,该页面内的元素可能在不用的时间间隔内进行加载.这使得元素定位变得比较困难:如果一个元素还没有出现在DOM中,定位函数将会抛出一个E ...

  8. [译]Selenium Python文档:六、页面对象

    本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...

  9. 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级

    SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...

随机推荐

  1. JTable 的使用

    JTable是Swing编程中的一种控件. 一.创建表格控件的各种方式:1) 调用无参构造函数. JTable table = new JTable(); 2) 以表头和表数据创建表格. Object ...

  2. 《JAVASCRIPT高级程序设计》节点层次和DOM操作技术

    DOM可以将任何HTML和XML文档描绘成一个由多层次节点构成的结构.节点分为几种不同的类型,每种类型分别表示文档中不同的信息,每种类型都继承与Node接口,因此都共同享有一些属性和方法,同时,也拥有 ...

  3. .Net基础体系和跨框架开发普及

    .net体系经过十几年发展,发生了很多变化.特别是在最近两年,随着开源和跨平台的发展,衍生出很多概念,像标准库,可移植库,.Net Core等,相信有不少同学对他们之间的关系是有一些困惑的,这里我从基 ...

  4. 今日头条- iOS客户端 启动速度优化实践

    版权声明 作者:今日头条iOS团队 原文:https://techblog.toutiao.com/2017/01/17/iosspeed/ 应用启动时间,直接影响用户对一款应用的判断和使用体验.头条 ...

  5. PLSQL游标使用

    游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据.由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标.游标可以看做是指向记录 ...

  6. Monit:开源服务器监控工具

    Monit是一个跨平台的用来监控Unix/linux系统(比如Linux.BSD.OSX.Solaris)的工具.Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不依赖任何第三方程序 ...

  7. 分布式配置管理--百度disconf搭建过程和详细使用

    先说官方文档:http://disconf.readthedocs.io/zh_CN/latest/index.html 不管是否要根据官方文档来搭建disconf,都应该看一下这一份文档.精炼清晰地 ...

  8. P177 test 6-4 UVa439

    //P177 test 6-4 UVa439 #include<cstdio> #include<cstring> #include<queue> using na ...

  9. 【2017年新篇章】 .NET 面试题汇总(二)

    本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇 第一篇文章请到这里:[2017年新篇章] .NET 面试题汇总(一) 简介 此次包含的不止是.NET知识,也包含少许前端知识以及.ne ...

  10. Eclipse:The selection cannot be launched,and there are no recent launches

    刚刚装上eclipse,于是就想写个Java程序来试试.结果写好之后不管是点击 run  还是  debug 结果都会弹出一个窗口,内容为: The selection cannot be launc ...