你使用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. 02月刊(上) | 微信小程序

    * { margin: 0; padding: 0 } .con { width: 802px; margin: 0 auto; text-align: center; position: inher ...

  2. react native 运行项目下载gradle慢的解决办法

    react-native run-android 慢 React-native run-Android中需要下载https://services.gradle.org/distributions/gr ...

  3. stringBuffer的使用及字符串比较的区别

    /* * 关于equals()和==: 对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true; * 而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的 ...

  4. 基于DDD的.NET开发框架ABP实例,多租户 (Sass)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍

    介绍 基于ABPZERO的多租户 (Sass)应用程序,采用ASP.NET MVC, Angularjs-介绍 ASP.NET Boilerplate作为应用程序框架. ASP.NET MVC和ASP ...

  5. Trick 小记

    1.\[P(A|BC) = \frac{P(AB|C)}{P(B|C)}\] 2. In EM algorithm, the usual expectation function can be wri ...

  6. HttpClient构造文件上传

    在项目中我们有时候需要使用到其他第三方的api,而有些api要求我们上传文件,search一下,下面将结果记录一下喽! 含义 ENCTYPE="multipart/form-data&quo ...

  7. NodeJs下的测试框架Mocha

    介绍和代码下载 Mocha在2011年发布,是目前最为流行的javascript框架之一,在本文我们重点介绍它在NodeJs上的使用. 如果你需要下载实例代码,可以通过这个链接 gitClone 或者 ...

  8. Git建空白分支

    先执行以下命令从当前分支建一个分支,NEWBRANCH为新分支名字. git checkout --orphan NEWBRANCH 执行上面命令后,会切换到新分支.再执行命令下面命令,清空该分支(注 ...

  9. iOS异步处理

    有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现. 同样在,在ios移动开发和Android基本是很类似的一 ...

  10. Node.js~在linux上的部署~外网不能访问node.js网站的解决方法

    这是上一篇node.js部署到linux上的后续文章,当我们安装完node.js之后,建立了sailsjs的网站,然后在外面电脑上无法访问这个网站,这个问题我们如何去解决? 解决思路: 查看linux ...