selenium学习笔记

Selenium-webdriver(Python)学习笔记

 

一.相关原理和知识

Selenium是一个关于Web的自动化测试工具,它具有免费,轻巧,支持多语言,多平台,支持分布式测试用例的执行等一系列的优点。

Selenium家族大致上有四名成员,即Selenium RC,SeleniumIDE,Selenium Grid,Selenium Webdriver。笔者主要学习的Selenium Webdriver。Selenium Remote Control是一个代理服务器,它可以把各种编程语言编写的Selenium测试程序发送到指定的浏览器上并运行,它的内容使用jetty做为webserver,通过RC的代理可以解决js调用时的同源策略限制。使用Java/C#/Ruby等语言进行Selenium编程时,Selenium的API实际上是通过RC代理服务向浏览器发送命令的。Selenium IDE只用于FF,具有很好的记录功能,同时能将一系列操作直接转成相关的各式的代码,使用方便,却只能用于FF,但是功能强大,转成代码方便学习,笔者受用很大。Selenium Webdriver是Selenium1.X加入了Webdriver后的新产品,也称为Selenium2.X,功能强大又轻巧,对于各个语言,相当于只要引入相关的包即可使用。

 

remote-control的原理:

       1.webdriver启动目标浏览器后,将绑定到指定的端口,以这个启动的浏览器实例做为web driver的remote server

       2.Client端通过CommandExcuter发送HTTPRequest给remote server的侦听商口协议。

       3.Remote Server需要依赖原生的浏览器组件,来转化浏览器的native调用

 

二.Selenium-webdriver的安装与启动

1.安装Python和Setuptools

2.安装Pip

3.安装selenium:

启动DOS,命令如下:pip install selenium

       检测:进入python解释器,输入from selenium import webdriver

4.下载ChromeDriver,将下载后的文件解压至Chrome的安装目录下,并将ChromeDriver的目录添加至Path中。

5.启动Chrome浏览器:

       在脚本中编辑:

       from selenium import webdriver

from time import sleep //引入时间,为展示效果,浏览器休眠3秒再关闭

dr = webdriver.Firefox()

sleep(3)

dr.close()

6.关闭浏览器:quit()和close()两种方法,quit表示关闭页面的选项,close表示全然关闭浏览器。

 

三.Selenium+WebDriver的简单操作

1.访问URL,有两种方式,一种是直接GET,一种是用navigate()方式。

       如访问谷歌:driver=webdriver.Chrome()

              Driver.get(“http://www.google.com.hk”)

2.获得当前网址的title:driver.title

 

3.定位元素:

要想操作一个对象,就需要对对象中的元素进行了解甚至是抓取,对象中的元素也即是属性,Webdriver中提供了很多的对象定位的方法,如下:

* id  HTML标签的id属性

* name HTML标签的name属性

* class_name HTML标签的class属性

* css_selector 元素使用到的css选择器

* link_text 链接的显示文本

* partial_link_name 链接显示文本的一部分

* tag_name 标签名

* xpath

假设有一个网页的输入框代码如下所示:

<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd"
autocomplete="off">

具体的操作方式如下:

Id:   driver.find_element_by_id(‘kw’) //选中id为kw的输入框

Name:  driver.find_element_by_name(‘wd’)

Class_name:  driver.find_element_by_class_name(‘s_ipt’)

Css_selector: driver.find_element_by_css_selector(‘#kw’)

Link_text: driver.find_element_by_link_text(‘吧’)

 

Xpath的定位:

XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,
所以 selenium 用户可是使用这种强大语言在 web 应用中定位元素。XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

最常用的表达式如下:

nodename    选取此节点的所有子节点。

/      从根节点选取。

//    从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

.      选取当前节点。

..     选取当前节点的父节点。

@    选取属性。

例子使用:

bookstore     选取 bookstore 元素的所有子节点。

/bookstore   

选取根元素 bookstore。

 

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

 

bookstore/book   选取属于 bookstore 的子元素的所有 book 元素。

//book   选取所有 book 子元素,而不管它们在文档中的位置。

bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。

//@lang 选取名为 lang 的所有属性。

 

4.添加休眠

       有时为了更好的展示结果,需要添加休眠时间,这个操作只需要引入time包就可以添加相关的代码。

Import  time

       Time.sleep(2)

       通过添加implicitly_wait()就可以方便的实现智能等待了,它的作用是隐式的等待一个元素被发现或者一个命令完成,这个方法每次会话只需要调用一次。

 

5.设置浏览器大小

最大化:driver.maximize_window()

       设置长宽:driver.set_window_size(480,500)

 

6.操作浏览器的前进,后退

       前进与后退的方法 driver.back()和driver.forward()

 

7.鼠标的点击与键盘的输入

       鼠标案例操作,在上述输入框中输入selenium并搜索

       代码如下:

driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(2)
#通过 submit() 来操作
driver.find_element_by_id("su").submit()

 

键盘按键的用法

当需要使用键盘输入时,需要引入一个包,方式如下

From selenium.webdriver.common.keys import Keys

使用的具体方法如下:

.. driver.find_element_by_id(‘kw’).send_keys(Keys.ENTER)

 

鼠标事件的复杂用法

在自动化测试中,常需要进行右击,双击的操作,完成这两个动作,需要引入ActionChains类。引入方式如下:

.. from selenium.webdriver.common.action_chains import ActionChains

具体的操作如下:

..fei=driver.find_element_by_xpath(…)

 Actionchains(driver).context_click(fei).perform()

Actionchains(driver).double_click(fei).perform()

 

8.定位frame页中的元素

       当页面中包含其它html文件时,在处理内部的html时,需要使用switch_to_frame函数将webdriver对象指向frame页面,当处理完frame页面时,可以通过switch_to_default_content函数回到主页面上。

 

9.定位元素组

       当我们要确认某一种元素数量或需要从某一些类似元素中找到特定的元素时,可以用到find_elements系列函数,比如列表中的一组CheckBox。操作如下

       CheckBoxs=driver.find_elements_by_xpath(..)

       ..for Checkbox in CheckBox

              Checkbox.click()

       CheckBoxs[0].click()

10.在进行自动化测试的过程中,有时候目标的元素并不容易定位,我们可以先定位到其父级的元素,再寻找目标元素。

 

11.处理prompt/alert/confirm

       处理JS原生的提示信息prompt/alert/confirm和处理frame类似,使用switch_to_alert方法切换对象,不同的是处理alert时是操作switch_to_alert的返回对象。

       处理的简单案例如下:

       fei_alert=driver.find_element_by_xpath(..)

       fei_alert.click()

       alert=driver.switch_to_alert()

 

12.处理弹窗

       这里的弹窗不是alert一类由JS产生的对话框,而是指打开一个新链接时,产生的新的浏览器窗口,这里需要使用到switch_to_window。这个函数接受两种参数,一个就是窗口句柄,另一个就是新打开的窗口名称。

 

13.调用JS

       执行JS一般有两种场景,一种是在页面直接执行JS,另一种是在某个已经定位的元素上执行JS。它使用execute_script(..)方法来执行。

       案例:

       js=”var q=document.getElementById(“”)

       driver.execute_script(js)

 

14.控制浏览器滚动条

       有时候我们需要控制页面滚动条上的滚动条,但滚动条并非是页面上的元素,这个时候就需要用JS来帮助操作。

       案例:在百度中输入selenium之后,将页面滚动至底部,然后再滚动至顶部相关功能代码如下:

       js="var q=document.documentElement.scrollTop=10000"

driver.execute_script(js)

js="var q=document.documentElement.scrollTop=0"

driver.execute_script(js)

 

四 自动化测试代码小试

# -*- coding: utf-8 -*-

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.support.ui import Select

from selenium.common.exceptions import NoSuchElementException

from selenium.common.exceptions import NoAlertPresentException

import unittest, time, re

import os

driver=webdriver.Firefox()

driver.get("http://wenwen.sogou.com/")

driver.maximize_window();

driver.find_element_by_name('ask').click()

time.sleep(2)

driver.find_element_by_id('s_login').click()

time.sleep(2)

driver.switch_to.frame('login_iframe')

driver.find_element_by_id('u').send_keys('123123')

driver.find_element_by_id('p').send_keys('123123')

time.sleep(5)

driver.find_element_by_id('login_button').click()

time.sleep(2)

driver.find_element_by_id("questionWrap").click()

time.sleep(2)

driver.find_element_by_id("questionWrap").clear()

time.sleep(2)

driver.find_element_by_id("questionWrap").send_keys(u"一枝红杏出墙来为什么这么神奇")

time.sleep(5)

driver.find_element_by_id("submitButton").click()

time.sleep(2)

driver.close();

 

posted @ 2015-11-10 18:30  kandylove2011  阅读(240)  评论(0编辑  收藏  举报