你使用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. ssh配置文件及问题解决

    一 ssh的配置文鉴模板 Host AAA User gitolite3 HostName IP地址 IdentityFile ~/.ssh/key 二 下载代码的方法 1 ssh git2 git ...

  2. ROM、RAM、DRAM、SRAM和FLASH的区别

    ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...

  3. 《JAVASCRIPT高级程序设计》客户端检测

    web开发的理想状态之一是浏览器支持一组最常用的功能,但是在现实情况下,浏览器间的差异非常大,因此,为了兼容大部分的了浏览器,开发人员首先需要设计最通用的方案,然后再使用客户端检测的技术增强该方案.客 ...

  4. .net 基础服务开源战略规划备忘录

    公司现状 1. 技术人员水平限制: 基础研发人员技术细节,性能处理能力不足,技术视野不够开阔;甚至一些高可用,高性能方案的概念都未听闻,更别提发展方向和思路了,令人痛心. 2. 技术反馈渠道限制: 公 ...

  5. 笔记之《用python写网络爬虫》

    1 .3 背景调研 robots. txt Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站 ...

  6. vb是如何连接数据库的

    vb是如何连接数据库的         刚开始学习数据库时 ,对数据库很不了解,尤其是模块中的代码.照着抄都有很多错的,每一句到底是什么意思呢,根本不懂.于是我就花费了大量的时间去查每一句代码的具体作 ...

  7. C语言一维数组转换为二维数组

    一维转二维代码示例: #include <stdio.h> #include <stdlib.h> #define ROW 3 #define COL 2 int main(i ...

  8. java继承(一)

    虽然说java中的面向对象的概念不多,但是具体的细节还是值得大家学习研究,java中的继承实际上就是子类拥有父类所有的内容(除私有信息外),并对其进行扩展.下面是我的笔记,主要包含以下一些内容点: 构 ...

  9. 一个Python小白5个小时爬虫经历 【续】

    前言 昨天实现了python简单的数据采集之后本来还挺高兴的,结果发现在.NET读取txt文件后反序列化总是报错.具体错误原因好像是从txt读取数据之后会自动加一个隐藏的字符串,没错,肉眼看不见,就导 ...

  10. JavaScript 基本类型值-Undefined、Null、Boolean

    ▓▓▓▓▓▓ 大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. ▓▓▓▓▓▓ Undefined ...