Python+Selenium笔记(七):WebDriver和WebElement,

 

(一)  WebDriver

WebDriver提供成千成万用来与浏览器交互的意义和装置,通过WebDriver的法力和一部分主意,来落到实处与浏览器窗口、警告、框架和弹出窗口的并行,它也提供了自动化操作浏览器导航栏、设置cookies、截屏等有益大家测试的特点。

(二)  WebDriver成效及形式

功能/属性

简单说明

current_url

获取当前页面的URL地址(driver.current_url)
下面的都是以这种方式,driver指浏览器驱动实例。
window_handle
获取当前窗口的句柄
name
获取该实例底层的浏览器名称
orientation
获取当前设备的方位
page_source
获取当前页面源代码
title
获取当前页面的标题
window_handles
获取当前会话里所有窗口的句柄

 

方法

简单说明

close()
关闭当前浏览器窗口
back()
后退一步
forward()
前进一步
get(url)
访问URL并加载网页到当前的浏览器会话
maximize_window()
最大化浏览器窗口
quit()
退出当前的驱动实例并关闭所有相关窗口
refresh()
刷新当前页面
implicitly_wait()
等待时间,单位为秒
set_page_load_timeout()
设置一个页面完全加载完成的超时等待时间,单位为秒
set_script_timeout()
设置脚本执行的超时时间

 

(三)  WebElement功效及办法

   
通过WebElement能够兑现与网站页面成分的交互,包含文本框、文本域、按钮、单选框、多选框、表格、行、列和div等。

功能/属性

简单说明

size
获取元素大小(例如element.size)
下面都是以这种方式,element指定位的某个元素
tag_name
获取标签的名称
text
获取元素的文本值

 

方法

简单说明

clear()
清除文本框或文本域的内容
click()
点击元素
get_attribute(name)
获取元素的属性值,name:要获取的属性名称
is_displayed()
检查元素对于用户是否可见
is_enabled()
检查元素是否可用
is_selected()
检查元素是否被选中,主要用于单选框和复选框
send_keys(value)
输入文本,value是要输入的值
submit()
提交表单。如果对元素使用,将会提交该元素所属的表单
value_of_css_property(property_name)
获取CSS属性的值, property_name是CSS属性的名称

 

(四)  操作表单、文本框、复选框、单选按钮

通过WebElement完结与各类HTML控件的自动化交互,例如在三个文本框输入文本、单击按钮、采取单选框也许复选框、获取成分的公文及属性值等。

比如,果壳网注册功效的自动化:

(这里只是举个例证哈,直接复制是没用的,上边包车型大巴代码只固定部分字段(邮箱、登录名和注册按钮),而且尚未拍卖验证码,验证码部分以后再研商怎么处理)

 1 def test_register_new_user(self):
 2 
 3     #定位并点击博客园首页的 注册 
 4 
 5     login_area = self.driver.find_element_by_css_selector('#login_area')
 6 
 7     register = login_area.find_element_by_link_text('注册')
 8 
 9     register.click()
10 
11     #检查打开的网页标题是不是'用户注册 - 博客园'
12 
13     self.assertTrue('用户注册 - 博客园' == self.driver.title)
14 
15     # 定位注册页面各个字段及注册按钮
16 
17     user_email = self.driver.find_element_by_id('Email')
18 
19     user_login_name = self.driver.find_element_by_id('LoginName')
20 
21     register_btn = self.driver.find_element_by_id('submitBtn')
22 
23     # 检查字段允许的最大输入字符与最小输入字符是否与预期一致
24 
25     self.assertEqual('2', user_login_name.get_attribute('data-val-length-min'))
26 
27     self.assertEqual('30', user_login_name.get_attribute('data-val-length-max'))
28 
29     # 检查各个字段及按钮对用户是否可见及可用
30 
31     self.assertTrue(user_email.is_displayed() and user_email.is_enabled())
32 
33     # 输入用户信息
34 
35     user_email.send_keys('[email protected]')
36 
37     user_login_name.send_keys('test')
38 
39     # 点击注册按钮
40 
41     register_btn.click()
42 
43     # 检查是否显示注册成功的提示
44 
45     self.assertTrue(self.driver.find_element_by_css_selector('p.txt-title.success-color').text == '注册成功')

 

 

譬如说,能够使用上面包车型大巴方法检查天涯论坛登录页面包车型地铁复选框是或不是被选中

 1 def test_login(self):
 2 
 3     …省略打开登录页面的代码(这段就不注释了#)
 4 
 5     automatic_login = self.driver.find_element_by_id('remember_me')
 6 
 7     #检查登录页面复选框,是否默认不被选中
 8 
 9     self.assertFalse(automatic_login.is_selected())
10 
11     #点击选中复选框
12 
13     automatic_login.click()

 

(一) WebDriver
WebDriver提供许多用来与浏览器交互的作用和设置,通过WebDriver的效率和局地方法…

从这一篇开头,开始正式的牵线Selenium
以及有关的零件,本文的将斟酌如下难题:

本章将介绍使用Selenium和PhantomJS二种工具用来加载动态数据,越来越多内容请参见:Python学习指南

(一)  WebDriver

  • Selenium基本的定义以及在集团化测试框架中的地方
  • Selenium大旨对象(浏览器驱动) Web Driver
  • Selenium核心对象(Dom成分)Web Element

Selenium

Selenium是多个Web的自动化测试工具,最初是为网站自动化测试而支付的,类型像大家玩游戏用的按键天使,能够按钦点的吩咐自动化操作,不一致是Selenium能够直接运转在浏览器上,它支持具有主流的浏览器(包括PhantomJS这个无界面包车型地铁浏览器)。

Selenium能够依据大家的吩咐,让浏览器自动加载页面,获取供给的页面,甚至页面截屏,只怕判断网站上一点动作是否爆发。

Selenium本身不带浏览器,不帮忙浏览器的效应,它须求与第①方浏览器结合在联合才能选拔。但是我们偶尔需求让它内嵌在代码中运营,全体大家而已用四个叫PhantomJS的工具代替真实的浏览器。

能够从PyPI网站下载Selenium库http://pypi.python.org/simple/sulenium,也得以用第1方管理器pip命令安装:pip install selenium
Selenium官方参考文书档案:http://selenium-python.readthedocs.io/index.html

WebDriver提供许多用来与浏览器交互的作用和装置,通过WebDriver的效应和某个情势,来贯彻与浏览器窗口、警告、框架和弹出窗口的交互,它也提供了自动化操作浏览器导航栏、设置cookies、截屏等便民我们测试的特色。

附带表达下,小编所讲到的是Selenium WebDriver的版本。

PhantomJS

PhantomJS是多少个基于Webkit的”无界面”(headless)浏览器,它会把网站加载到内部存款和储蓄器并实施页面上的JavaScript,因为不会展现图形界面,所以运行起来比完全的浏览器更高速。

假诺大家把Selenium和PhantomJS结合在联合署名,就能够运维三个11分强大的网络爬虫了,那几个爬虫能够处理JavaScript、库克ie、headers,以及其他大家实在用户必要做的作业。

小心:PhantomJS只好从它的网站(http://phantomjs.org/download.html)下载。因为PhantomJS是三个功能完善(就算无界面)的浏览器而非三个Python库,所以它不必要像Python的任何库一样安装,但我们能够透过Selenium调用PhantomJS来一向利用
PhantomsJS官方才考文书档案:http://phantomjs.org/documention

(二)  WebDriver功用及措施

(一):Selenium基本概念

Selenium相关的概念的和资料在网上有那贰个。上边包车型客车这一个是引用百度方面包车型大巴牵线:

  Selenium是3个用以Web应用程序测试的工具。Selenium测试直接运营在浏览器中,就像是真的的用户在操作一样。援助的浏览器包罗IE(⑦ 、八 、9)、Mozilla
Firefox、Mozilla Suite、谷歌(Google)Chrome等。那些工具的重庆大学职能包罗:测试与浏览器的包容性——测试你的应用程序看是还是不是能够很好得工作在分化浏览器和操作系统之上。测试系统作用——创立回归测试检查软件功能和用户须要。支持活动录像动作和自动生成
.Net、Java、Perl等不等语言的测试脚本。

  设置这一有的的情节不是为着表明Selenium是什么,究竟类似的能源无论一搜就有一大把。小编更想享受给我们的是Selenium自身在小卖部级的测试框架中处于三个哪些的岗位。就拿本人延续文章想要给咱们突显的测试框架结构来说。Selenium所处的职位。如图所示,Selenium可是是全部育项目测验试框架的一片段提供了针对性B/S应用程序的测试驱动(即协理我们提供了模拟在浏览器内部开始展览操作的效应),而完好的自动化平台的搭建还会组成其余的框架(如:单元测试框架<xUnit.Net>,针对Windows桌面应用的驱动,针对手提式有线电话机选用的驱动,提供数据访问的能力…
…),对于怎样创设完整的测试框架有时机笔者会开2个新的宗旨小说来谈谈,不懂也绝非涉嫌,那里只是希望初大方在一起来就有二个种类的概念,知道自身所学的剧情现在会用在哪个地方,该用在哪个地方。

 金沙注册送58 1

快快入门

SeleniumCurry有三个叫WebDriver的API。WebDriver能够操纵浏览器的操作,它可以像BeautifulSoup也许别的Selector对象一样用来寻觅页面成分,与页面上的要素实行交互(发送文书、点击等),以及执行其它动作来运营网络爬虫。

#-*-  coding:utf-8 -*-
#主要用来测试selenium使用phantomJs

#导入webdriver
from selenium import webdriver
import time

#要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys

#调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.PhantomJS()
driver.set_window_size(1366, 768)
#如果没有在环境变量指定PhantomJS位置
#driver = webdriver.PhantomJS(executable_path = "./phantomjs")

#get方法会一直等到页面加载,然后才会继续程序,通常测试会在这里选择time.sleep(2)

driver.get("http://www.baidu.com/")

#获取页面名为wraper的id标签的文本内容
data = driver.find_element_by_id('wrapper').text

#打印数据内容
print(data)

print driver.title

#生成页面快照并保存
driver.save_screenshot("baidu.png")

# id="kw"是百度搜索输入框,输入字符串"长城"
driver.find_element_by_id('kw').send_keys(u'长城')

# id="su"是百度搜索按钮,click()是模拟点击
driver.find_element_by_id('su').click()

#获取新的页面快照
driver.save_screenshot("长城.png")

#打印网页渲染后的源代码
print(driver.page_source)

#获取当前页面Cookie
print(driver.get_cookies())

#ctrl+a全选输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
#ctrl+x剪切输入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')

#输入框重新输入内容
driver.find_element_by_id('kw').send_keys('itcast')

#模拟Enter回车键
driver.find_element_by_id('su').send_keys(Keys.RETURN)
time.sleep(5)

#清空输入框内容
driver.find_element_by_id('kw').clear()

#生成新的页面快照
driver.save_screenshot('itcast.png')

#获取当前url
print(driver.current_url)

driver.quit()

功能/属性

简单说明

current_url

获取当前页面的URL地址(driver.current_url)
下面的都是以这种方式,driver指浏览器驱动实例。
window_handle
获取当前窗口的句柄
name
获取该实例底层的浏览器名称
orientation
获取当前设备的方位
page_source
获取当前页面源代码
title
获取当前页面的标题
window_handles
获取当前会话里所有窗口的句柄

(二):Selenium 大旨指标 – 浏览器驱动(WebDriver)

  正如从前讲到的,Selenium首要的功效是帮扶大家来模拟人工操作浏览器。那么,大家相应怎么样来操作浏览器呢?答案便是WebDriver,
Selenium
为大家提供了操作浏览器的联结接口以及针对种种主流浏览器驱动程序的贯彻:

金沙注册送58 2

  如上海教室所示,能够阅览每一个WebDriver
都以对了逐条浏览器厂商提供的驱动包的包裹,Selenium的独到之处在于为使用者提供了多样语言版本的Driver,那里大家只是描述C#本子的贯彻,其余版本也有像样的落到实处。说到此处,大家得以类比一下别的的测试驱动框架比如Appium,或是惠特e,其实都以包装了系统提供的自动化测试API,下落了上层的费用还是测试职员的就学花费和编制程序复杂度…

把上海体育场面简化一下,大家能够看到以下多少个指标:

  • IWebDriver : Selenium
    定义的WebDriver接口,具备常用的浏览器操作功用。
  • ChromeDriver : 基于谷歌浏览器的驱动,使用时索要至极的驱动程序。
  • FireFoxDriver : 基于Firefox浏览器的驱动。
  • InternetExplorerDriver :
    基于IE浏览器的驱动,使用时索要非常的驱动程序。

金沙注册送58 3

上边列出了Driver接口定的第③方法和属性:

页面操作

Selenium的WebDriver提供了各样艺术来寻觅成分,若是上面有多个表单输入框:

<input type="text" name="user-name" id="passwd-id" />

那么:

#获取id标签值
element = driver.find_element_by_id("passwd-id")
#获取name值
element = driver.find_element_by_name("user-name")
#获取标签名
element = driver.find_element_by_tag("input")
#也可以通过XPath来匹配
element = driver.find_element_by_xpath(//input[@id="passwd-id"])

 

Methods:

  • Close : 关闭当前窗口。
  • FindElement : 查找Dom成分,再次回到单个的DOM成分。
  • FindElements : 查找Dom成分,再次回到符合条件的DOM成分集合。
  • Manage : 管理浏览器的安装消息。
  • Navigate : 导航到有个别地方。
  • Quit : 关闭浏览器。
  • SwitchTo : 用于切换Frame 和Window,处理弹出框等。

定位UI元素(WebElements)

至于成分的选料,有如下的API单个成分选用

  1. find_小北De编制程序手记。element_by_id
  2. find_element_by_name
  3. find_element_by_xpath
  4. find_element_by_link_text
  5. find_element_by_partial_link_text
  6. find_eelement_by_tag_name
  7. find_element_by_class_name
  8. find_element_by_css_selector

方法

简单说明

close()
关闭当前浏览器窗口
back()
后退一步
forward()
前进一步
get(url)
访问URL并加载网页到当前的浏览器会话
maximize_window()
最大化浏览器窗口
quit()
退出当前的驱动实例并关闭所有相关窗口
refresh()
刷新当前页面
implicitly_wait()
等待时间,单位为秒
set_page_load_timeout()
设置一个页面完全加载完成的超时等待时间,单位为秒
set_script_timeout()
设置脚本执行的超时时间

Properties:

  • CurrentWindowHandle : 获取当前窗口的操作句柄。
  • PageSource : 获取最终贰次加载的页面源代码。
  • Title : 获取当前页面包车型地铁Title。
  • Url : 获取或设置当前浏览器的Url地址。
  • WindowHandles : 获取当前浏览器全体打开窗口的操作句柄。

1. By ID

<div id="coolesWidgeEvah">...</div>
  • 实现

element = driver.find_element_by_id("coolesWidgetEvah")

---------or-------
from selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolesWidgetEvah")

 

(三):Selenium 大旨指标 – DOM成分对象(WebElement)

  同WebDriver一样,Selenium提供的WebElement对象是用来讲述页面上的DOM对象(HTML的DOM对象用来描述页面上的HTML成分),如页面上的按钮,多选框,输入框,文本域,图片…

都得以看成是二个WebElement对象,在前边的稿子里,会对WebElement相关的操作和指向各种分化的DOM对象类型的处理做越来越的介绍,这一片段我们给我们显示一下WebElement常用的格局和性质:

2. By Class Name

<div class="cheese">Cheddar</div><div class="cheese">Gouda</div>
  • 实现

cheese = driver.find_element_by_class_name('cheese')

----------------or--------------------
from selenium.webdriver.common.by import By
cheese = driver.find_elements(By.CLASS_NAME, "cheese")

(三)  WebElement作用及格局

Methods:

  • Clear : 清空当前DOM成分内容(用于文书输入成分)。
  • Click : 单击当前DOM成分。
  • FindElement : 查找当前DOM元素下的子成分,再次回到单个的DOM元素。
  • FindElements :
    查找当前DOM成分下的子成分,再次回到符合条件的DOM成分集合。
  • GetAttribute: 获取当前DOM成分的属性值。
  • GetCssValue : 获取当前DOM成分CSS样式。
  • SendKey : 想当前DOM成分输入钦命文本。
  • Submit : 提交当前元素到Web服务器。

3. By Tag Name

<iframe src="..."></iframe>
  • 实现

frame = driver.find_element_by_tag_name("iframe")
------------------------or---------------
from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")

   
通过WebElement能够兑现与网站页面成分的相互,包含文本框、文本域、按钮、单选框、多选框、表格、行、列和div等。

Properties:

  • Display: 获取成分是不是出示。
  • Enabled: 获取成分是不是可用。
  • Location : 获取成分地方音讯。
  • Seleced : 获取成分是不是选中。
  • Size : 获取元素的Height 和 Width。
  • TagName : 获取成分的TagName。
  • Text : 获取成分的文本内容。

4.By Name

<imput name="cheese" type="text" />
  • 实现

cheese = driver.find_element_by_name("cheese")

-------------or-------------------------
from selenium.webdrier.common.by import By
cheese = driver.find_element(By.NAME, "cheese")

功能/属性

简单说明

size
获取元素大小(例如element.size)
下面都是以这种方式,element指定位的某个元素
tag_name
获取标签的名称
text
获取元素的文本值

(四):Selenium 大旨指标 – By Class(定位条件)

  关于By Class笔者会在下一篇《Lesson 03 – Selenium For C# 之
成分定位》中牵线。

5. By Link Text

<a href="http://www.google.com/search?q=cheese">cheese</a>
  • 实现

cheese = driver.find_element_by_link_text("cheese")
---------------------or-----------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")

 

(五):Demo

  说了如此多,该到起先写点什么的时候了。so…
作者做了个简易的Demo供我们有个感官的认识。下边包车型大巴Code笔者早就上传到Github地址是:

  这些Dome的要紧有四个目标,一方面对从前描述的一对概念做3个简练的展示,另一方面首要呈现了xUnit.Net
Test Case的焦点构造,代码如下:

 1 using OpenQA.Selenium;
 2 using OpenQA.Selenium.Firefox;
 3 using Xunit;
 4 using Xunit.Abstractions;
 5 
 6 namespace Demo.SeleniumTest
 7 {
 8     public class Lesson02_CoreObject
 9     {
10         /// <summary>
11         /// 输出对象
12         /// </summary>
13         private readonly ITestOutputHelper _output;
14         /// <summary>
15         /// 构造函数,初始化输出对象
16         /// </summary>
17         /// <param name="output">注入输出对象</param>
18         public Lesson02_CoreObject(ITestOutputHelper output)
19         {
20             this._output = output;
21         }
22 
23         /// <summary>
24         /// demo1 : 获取元素
25         /// </summary>
26         [Fact(DisplayName = "Cnblogs.CoreObject.Demo1")]
27         public void CoreObject_Demo1()
28         {
29             _output.WriteLine("Step 01 : 启动浏览器并打开博客园首页。");
30             IWebDriver driver = new FirefoxDriver();
31             driver.Url = "http://www.cnblogs.com";
32             driver.Manage().Window.Maximize();
33 
34             _output.WriteLine("Step 02 : 获取并输出部分页面信息。");
35             _output.WriteLine(string.Format("Current window handle: {0}", driver.CurrentWindowHandle));
36             _output.WriteLine(string.Format("Window handle count: {0}", driver.WindowHandles.Count));
37             _output.WriteLine(string.Format("Current window title: {0}", driver.Title));
38 
39             _output.WriteLine("Step 03 : 验证博客园站点的 Title 是否正确。");
40             Assert.Equal<string>("博客园 - 开发者的网上家园", driver.Title);
41 
42             _output.WriteLine("Step 04 : 关闭当前页面。");
43             driver.Close();
44         }
45     }
46 }

此地本人回顾的牵线一下Code的逻辑:

  首先,构造函数注入了出口的靶子,这一部分我会在xUnit.Net相关的小说作讲解。性急的同桌要是迫不比待笔者的翻新也得以参照xUnit.Net的文书档案:

  然后,就是大家的Test case
,开启本机的银狐浏览器>最大化并导航到知乎首页>输出音讯>检验Title是不是科学>关闭浏览器。

  需求表明的是
输出和验证Title是xUnit.Net的效益(每一种单元测试框架都有)。当然,生产条件使用的测试Code是会做越多的卷入的,那么些代码只是供我们学习使用。

  最终,处理你会看见你本机的浏览器上边的操作之外,还会博得如下的输出结果:

金沙注册送58 4

 

总括:本文首要介绍了以下几点内容。

  • Selenium的效果以及在集团级测试框架中的地方。
  • 浏览器控制指标(驱动) WebDriver
  • DOM成分对象WebElement
  • 基本的Test Case 书写

关于《Selenium For C#》 连串,我陈设给我们逐一介绍部分Selenium
Driver的基础知识和框架的扩展点。
当然,之后会有越多关于测试框架构以及软件塑造方面包车型地铁小说。愿本人主保佑小编有时间做完那件事情…

《Selenium For C#》的有关文章:Click
here.

  • [小北De编制程序手记] : Lesson 01 – Selenium For C# 之
    环境搭建
  • [小北De编制程序手记] : Lesson 02 – Selenium For C# 之
    大旨指标
  • [金沙注册送58,小北De编制程序手记] : Lesson 03 – Selenium For C# 之
    成分定位
  • [小北De编制程序手记] : Lesson 04 – Selenium For C# 之 API
  • [小北De编程手记] : Lesson 05 – Selenium For C# 之 API
  • [小北De编程手记] : Lesson 06 – Selenium For C# 之
    流程序控制制
  • [小北De编程手记] : Lesson 07 – Selenium For C# 之
    窗口处理
  • [小北De编制程序手记] : Lesson 08 – Selenium For C# 之 PageFactory &
    团队创设

说明:Demo地址:

假若你认为这篇小说还不错只怕具有收获,能够点击右下角的**【推荐】按钮,因为你的帮助是本身继续写作,分享的最大重力!**

作者:小北@North

来源:

申明:本博客原创文字只代表自个儿工作中在某临时间内总计的看法或结论,与自家所在单位没有一直利益关联。非商业,未授权,贴子请以现状保留,转发时务必保留此段证明,且在篇章页面鲜明地点给出原来的作品连接。

6.By Partial Link Text

<a href="http://www.google.com/search?q=cheese">search for cheese</a>
  • 实现

cheese = driver.find_element_by_partial_link_text("cheese")

-----------------or-----------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "cheese")

方法

简单说明

clear()
清除文本框或文本域的内容
click()
点击元素
get_attribute(name)
获取元素的属性值,name:要获取的属性名称
is_displayed()
检查元素对于用户是否可见
is_enabled()
检查元素是否可用
is_selected()
检查元素是否被选中,主要用于单选框和复选框
send_keys(value)
输入文本,value是要输入的值
submit()
提交表单。如果对元素使用,将会提交该元素所属的表单
value_of_css_property(property_name)
获取CSS属性的值, property_name是CSS属性的名称

6.By CSS

<div id="food">milkcheese</div>
  • 实现

cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
----------------or-------------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")

 

7.By XPath

<input type="text" name="example" / >
<input type="text" name="other" / >
  • 实现

inputs = driver.find_elements_by_xpath("input")
-------------------or------------------
from selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")

(四)  操作表单、文本框、复选框、单选按钮

鼠标动作链

些微时候,我们要求在页面上模仿一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,咱们可透过导入ActionChains类来做到:

**示例: **

#导入ActionChains类
from selenium.webdrive import ActionChains

#鼠标移动到ac位置
ac = driver.find_elenemt_by_xpath('element')
ActionChains(driver).move_to_element(ac).perform()

#在ac位置单击
ac = driver.find_element_by_xpath('elementA')
ActionChains(driver).move_to_element(ac).click(ac).perform()

#在ac位置双击
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()

#在ac位置右击
ac = driver.find_element_by_xpath('elementC')
ActionChains(driver).move_to_element(ac).context_click(ac).perform()

#在ac位置左键单击hold住
ac = driver.find_element_by_xpath('elementF')
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()

#将ac1拖拽到ac2位置
ac1 = driver.find_element_by_xpath('elementD')
ac2 = driver.find_element_by_xpath('elementE')
ActionChains(driver).drag_and_drop(ac1, ac2).perform()

经过WebElement达成与种种HTML控件的自动化交互,例如在3个文本框输入文本、单击按钮、选用单选框也许复选框、获取成分的公文及属性值等。

填充表单

咱俩已经领悟了何等向文本框输入文字,可是有时大家会遭逢<select></select>标签的下拉框。直接点击下拉框中的选项不自然可行。

<select id="status" class="form-control valid" onchange="" name = 'status'>
    <option value=""></option>
    <option value="0">未审核</option>
    <option value="1">初审通过</option>
    <option value="2">复审通过</option>
    <option value="3">审核不通过</option>
</select>

金沙注册送58 5

下拉框

Selenium专门提供了Select类来处理下拉框。其实WebDriver中提供了三个叫Select的方法,能够支持大家完结这几个工作:

#导入Select类
from selenium.webdriver.support.ui import Select

#找到name的选项卡
select = Select(driver.find_element_by_name('status'))

#s
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u'未审核')

以上是三种选取下拉框的法门,它能够依照目录来抉择,能够根据值来抉择,能够依照文字来摘取。注意:

  • index索引从0开始
  • value是option标签的3个属性值,并不是显示在下拉框中的值
  • visible_text实在option标签文本的值,是显示在下拉框的值

全方位打消选取如何是好呢?很不难:

select.deselect_all()

譬如,博客园注册功效的自动化:

弹窗处理

当你触发了有些事件过后,页面出现了弹窗提醒,处理那几个提醒也许取得提醒新闻方法如下:

alert = driver.switch_to_alert()

(那里只是举个例子哈,直接复制是没用的,上面包车型客车代码只固定部分字段(邮箱、登录名和登记按钮),而且没有处理验证码,验证码部分未来再商量怎么处理)

页面切换

3个浏览器肯定会有那多少个窗口,所以大家终将要有艺术来达成窗口的切换,切换窗口的章程如下:

driver.switch_to_window('this is window name')

也得以应用window_handles方法来获取每一种窗口的操作对象。例如:

for handle in driver.window_handles:
    driver.switch_to_window(handle)
 1 def test_register_new_user(self):
 2 
 3     #定位并点击博客园首页的 注册 
 4 
 5     login_area = self.driver.find_element_by_css_selector('#login_area')
 6 
 7     register = login_area.find_element_by_link_text('注册')
 8 
 9     register.click()
10 
11     #检查打开的网页标题是不是'用户注册 - 博客园'
12 
13     self.assertTrue('用户注册 - 博客园' == self.driver.title)
14 
15     # 定位注册页面各个字段及注册按钮
16 
17     user_email = self.driver.find_element_by_id('Email')
18 
19     user_login_name = self.driver.find_element_by_id('LoginName')
20 
21     register_btn = self.driver.find_element_by_id('submitBtn')
22 
23     # 检查字段允许的最大输入字符与最小输入字符是否与预期一致
24 
25     self.assertEqual('2', user_login_name.get_attribute('data-val-length-min'))
26 
27     self.assertEqual('30', user_login_name.get_attribute('data-val-length-max'))
28 
29     # 检查各个字段及按钮对用户是否可见及可用
30 
31     self.assertTrue(user_email.is_displayed() and user_email.is_enabled())
32 
33     # 输入用户信息
34 
35     user_email.send_keys('test@163.com')
36 
37     user_login_name.send_keys('test')
38 
39     # 点击注册按钮
40 
41     register_btn.click()
42 
43     # 检查是否显示注册成功的提示
44 
45     self.assertTrue(self.driver.find_element_by_css_selector('p.txt-title.success-color').text == '注册成功')

页面包车型地铁上进和滞后

操作页面包车型大巴提升和落后效能:

driver.forward()  #前进
driver.back()    #后退

 

Cookies

获取页面每一个Cookies值,用法如下:

for cookie in driver.get_cookies():
    print("%s -> %s"%(cookie['name'], cookie['value']))

删去Cookies,用法如下:

#By name
driver.delete_cookie('CookieName')

#all
driver.delete_all_cookies()

 

页面等待

只顾:那是不行主要的一局部!
今日的网页原来更多选择了Ajax技术,这样程序变不能够明确几时某些成分完全加载出来了。假若实际页面等待事件过长导出有些dom成分还没出来,然而你的代码直接利用了这些WebElement,那么就会抛出NullPointer的不胜。
为了幸免那种成分定位困难而且会增强发生ElementNotVisibleException的概率。所以Selenium提供了两种等待格局,一种是隐式等待,一种是显式等待。
隐式等待正是等待特定的时辰,展现等待是点名某一标准知道这些规格建马上继续执行。

诸如,可以使用上面包车型地铁点子检查微博登录页面包车型大巴复选框是或不是被选中

显式等待

显示等待内定了有些条件,然后设置最长等待事件。如若在这些小时还找到没有成分,那么便会抛出分外。

from selenium import webdriver
from selenium.webdriver.common.by import By

#WebDriverWait库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
#expected_conditions类,负责条件触发
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get("http://www.xxxx.com/loading")

try:
    #页面一直循环,知道id="myDynamicElement"出现
    element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
finally:
    driver.quit()    

设若不写参数,程序私下认可会0.5s调用二回来来查看安苏是不是已经变化,假如本来成分时存在的,那么会应声赶回。

下面是局地停放的守候条件,你能够直接调用这么些标准,而不用本人写一些等待条件了。

    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
    aert_is_present
 1 def test_login(self):
 2 
 3     …省略打开登录页面的代码(这段就不注释了#)
 4 
 5     automatic_login = self.driver.find_element_by_id('remember_me')
 6 
 7     #检查登录页面复选框,是否默认不被选中
 8 
 9     self.assertFalse(automatic_login.is_selected())
10 
11     #点击选中复选框
12 
13     automatic_login.click()

隐式等待

隐式等待相比较不难,就是简单地设置2个等候时间,单位为秒。

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  #seconds

driver.get("http://www.xxxxx.com/loading")

myDynamicElement = driver.find_element_by_id("myDynamicElement")

假使不安装,私下认可等待时间为0。

 

相关文章

网站地图xml地图