基础——selenium

安装

插件:firebug、firepath 注意:安装firepath需要先安装firebug

一、安装selenium
  1. 在线安装:命令行(cmd)窗口输入pip install selenium就会默认安装最新版本的seleium
  2. 离线安装:
    a、到官网上https://pypi.org/project/selenium/下载selenium……tar.gz
    b、解压缩到某个磁盘路径下
    c、启动cmd命令行窗口,使用cd进入该解压缩后的磁盘路径,执行python setup.py install
二、安装浏览器及驱动

windows:

1、下载对应版本的chromedriver、geckodriver
2、把chromedriver.exe拷贝到python安装目录的Scripts目录下(添加到系统环境变量)

查看python安装路径: where python

3、验证
cmd命令行: chromedriver

下载地址

chromedriver : 下载对应版本
http://chromedriver.storage.googleapis.com/index.html

geckodriver
https://github.com/mozilla/geckodriver/releases

1、下载后解压
   tar -zxvf geckodriver.tar.gz 
2、拷贝解压后文件到 /usr/bin/ (添加环境变量)
   sudo cp geckodriver /usr/bin/
3、更改权限
   sudo -i
   cd /usr/bin/
   chmod 777 geckodriver
二、元素定位
  • id定位
    使用目标页面元素的id属性值来定位,这是最建议使用的定位方法,因为id属性是页面元素的唯一标识,所以定位最准确。
driver.find_element_by_id("username")

from selenium.webdrive.common.by import By
driver.find_element(By.ID,"password")
  • xpath定位
driver.find_element_by_xpath(".//*[@id='mainNav']/a[10]")

from selenium.webdrive.common.by import By
driver.find_element(By.XPATH,".//*[@id='mainNav']/a[10]")
a、绝对路径xpath表达式:从根节点(html)开始按照路径级别书写,例如:html/body/form/textarea
b、相对路径xpath表达式:从中间层某节点开始书写,例如://form/textarea
更建议使用相对路径xpath表达式,因为更容易维护。xpath表达式既可以定位一个页面元素,也可以定位一组页面元素。
  • name定位
    使用name属性值来定位,也是比较建议使用的定位方法,没有id定位准确,因为可能存在多个页面元素,name属性值相同。
driver.find_element_by_name("imageField")

from selenium.webdriver.common.by import By
driver.find_element(By.NAME,"imageField")
  • link_text定位
    使用链接的文本来定位,只适用于链接,不适用于其他类型的页面元素。
    链接的文本就是与之间的文本内容。
driver.find_element_by_link_text("退出")

from selenium.webdriver.common.by import By
driver.find_element(By.LINK_TEXT,"退出")
  • partial_link_text定位
    使用链接的一部分文本来定位,一般适用于长链接。
driver.find_element_by_partial_link_text("总计金额")

from selenium.webdriver.common.by import By driver.find_element(By.PARTIAL_LINK_TEXT,"原装电池")
  • class_name定位
    使用页面元素的class属性值来定位,不建议直接使用,因为可能存在多个页面元素class属性值相同,定位可能会不准确。

  • tag_name定位
    使用页面元素的标记名称来定位,也是不建议直接使用,因为可能存在标记名称相同的多个页面元素,也会定位不准确

三、常见的控件操作
  • 文本框或文本域
    (1)输入数据:send_keys是追加输入,有一个参数,就是要输入的那个字符串。
    (2)清空:clear,无参。

  • 按钮
    (1)点击:click,无参。
    (2)获得按钮上的文本内容:get_attribute,有一个参数,一般是value,代表获得value属性的当前值(就是按钮上的当前文本内容)。
    (3)获得按钮是否可用的状态数据:is_enabled,无参,返回值是bool数据,True代表可用,False代表不可用(置灰)。

  • 单选按钮和复选框
    (1)点击:click,无参,点击后可以选中。
    (2)获得是否被选中的状态:is_selected,无参,返回值是bool类型,True代表被选中的状态,False代表未被选中的状态。
    (3)获得文本值:get_attribute,有一个参数,一般是value,代表获得其value属性值(就是文本值)。

补充:定位页面元素时,可以使用find_element来定位一个页面元素(第一个),也可以使用find_elements来定位一组页面元素(以list形式返回)。

  • 纯文本或超级链接
    文本出现在开始和结束标记之间,都可以使用text属性来获得。
    注意:text属性名称后不加小括号!!!

  • 图片:点击click

四、模拟键盘特殊按键操作

1、先导入Keys类
from selenium.webdriver.common.keys import Keys
2、send_keys后参数位置就可以使用这些键盘上的特殊按键来操作。
说明:如果是组合键,使用逗号分隔。
示例:

from selenium.webdriver.common.keys import
在这里插入图片描述

五、下拉列表操作

下拉列表四步操作:导入、定位、封装、操作。
第一步:导入Select类
第二步:定位下拉列表,与普通页面元素定位无区别
第三步:封装为Select类型的对象。
第四步:操作它。

from selenium.webdriver.support.select import Select
cat=driver.find_element_by_id("category")
cat_select=Select(cat)1)选择第3个选项
cat_select.select_by_index(2)
2)通过value属性值选择选项
示例:选择value属性值等于”12“的选项(也就是”充值卡“)
cat_select.select_by_value("12")3)通过选项的文本选择选项
说明:选项的文本就是<option></option>之间的文本。
示例:选择文本内容是“充值卡”的选项
cat_select.select_by_visible_text("充值卡")4)通过选项编号取消选择选项
示例:取消选择“汉族”(1个选项)
ns.deselect_by_index(0)5)通过value属性值来取消选择选项
示例:取消选择“回族”
ns.deselect_by_value("回族")6)通过选项的文本来取消选择选项
示例:取消选择“满族”
ns.deselect_by_visible_text("满族")7)所有选项全部取消
示例:ns.deselect_all()8)获得是否允许多选的状态值,True代表允许多选,False代表不允许多选。默认没有multiple属性时,None也代表默认不允许多选。
示例:print(ns.is_multiple)9)获得所有备选项,不管当前是选中的,还是未选中的,全部都活的到,options返回一个list。
示例:获得所有的备选项(不一定被选中)
for city in cs.options:
    print(city.text)10)获得所有已选择的选项,all_selected_options返回一个list。
示例:print("所有已选择的选项是:")
for option in ns.all_selected_options:
    print(option.text)11)获得唯一一个被选择的选项,输出其文本
示例:print(cs.first_selected_option.text)
六、弹出信息框操作

1.Alert对象:网页上层弹出的信息框。
2.切换到弹出框,获得Alert对象。
示例:
a1=driver.switch_to.alert
3.获得弹出框中的文本信息,使用text属性就可以获得。
示例:
print(a1.text)#请输入姓名!
4.点击“确定”关闭弹出框,包括所有肯定答案按钮(确定、是),调用accept实现。
示例:a1.accept()
5.点击“取消”关闭弹出框,包括所有否定答案按钮(取消、否),调用dismiss实现。
示例:a1.dismiss()
6.如果是输入型弹出框,可以调用send_keys实现输入数据的要求。
示例:a1.send_keys(“123456”)
7.说明:webdriver在处理弹出框中的换行符时没有缺陷,所以换行符需要写\n

七、操作浏览器

1.获得当前网页标题,title属性,后面不加小括号。

driver.title

2.获得当前网页地址(URL),current_url属性,后面不加小括号。

driver.current_url

3.浏览器后退,back函数,无参。

driver.back()

4.浏览器前进,forward函数,无参

driver.forward()

5.浏览器刷新,refresh函数,无参

driver.refresh()

6.设置浏览器窗口大小,set_window_size,需要宽度和高度两个参数,都是像素值。

driver.set_window_size(1000,500)

先查看屏幕分辨率,设置为与分辨率相同的宽度和高度,接近于最大化的效果。

driver.set_window_size(1024,768)

7.切换到新浏览器窗口

(1)先获得当前浏览器窗口句柄
h1=driver.current_window_handle
(2)获得当前所有自动启动的浏览器窗口句柄,返回list
all=driver.window_handles
(3)遍历,判断不是当前窗口,就是目标窗口
for h in all:
    if h!=h1:
        driver.switch_to.window(h)

8.关闭浏览器窗口:
quit:无参,关闭所有由WebDriver自动启动的浏览器窗口。
close:无参,关闭当前所操作的这一个浏览器窗口,保留其他浏览器窗口。

等待操作

(1)线程休眠:time的sleep函数来实现等待固定时间,初学者使用较多,语法简单,但是效率和稳定性无法保证。
(2)隐式等待:全局的等待时间,设置了每个页面元素定位的超时等待时间(最多等待多久)。

第一步:导入异常类
from selenium.common.exceptions import NoSuchElementException
第二步:设置隐式等待的超时时间为10秒
driver.implicitly_wait(10)
第三步:尝试定位元素来操作
try:
    un_input=driver.find_element_by_id("username")
    un_input.send_keys("lisi")
    pw_input=driver.find_element_by_id("password")
    pw_input.send_keys("123456")
    cm_input=driver.find_element_by_id("comments")
    cm_input.send_keys("hello")
    s_button=driver.find_element_by_id("submit")
    s_button.click()
 如果抛出异常,那么处理这些异常
except NoSuchElementException as e:
    print(e)
最终关闭浏览器
finally:
    driver.quit()

(3)显式等待:等待固定条件成立后继续运行代码,可以根据业务需要,等待更具体的一些条件,例如:标题等于xxx,网址包含xxx,元素出现,弹出框出现,按钮变为可用……。

第一步:导入相关类和模块
rom selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
第二步:实例化WebDriverWait对象,1个参数driver对象,
 第2个参数是等待的超时时间(单位是秒)
 第3个参数是检测条件是否成立的间隔时间(单位也是秒),默认是0.5,可省略
w1=WebDriverWait(driver,10,0.5)
第三步:等待指定条件成立
un_locator=(By.NAME,"username")
ec1=EC.presence_of_element_located(un_locator)
un_input=w1.until(ec1)
切换Frame

1.Frame或IFrame标记是用于在主网页中嵌套显示子网页的技术,在WebDriver的自动化测试中,目标页面元素如果属于某个Frame子网页内的元素,那么就必须先切换进入该Frame,才能定位到。

2.切换Frame的实现方式

1)方式一:通过frame或iframe标记的id或name属性值来切换。---最常用!!!
示例:
切换到id或name属性值是f2的Frame里
driver.switch_to.frame("f2")2)方式二:通过索引号(编号)来切换。
查看当前要切换进入的frame或iframe是当前网页中的第几个frame,按照从0开始的编号来切换。
示例:
切换到第2个Frame
driver.switch_to.frame(1)3)方式三:通过其他方式(例如xpath、className等)先定位到frame或iframe标记的页面元素,再把该元素对象作为切换Frame的参数数据。
示例:
通过xpath定位到目标frame,然后再切换进入该frame
frame2=driver.find_element_by_xpath("//frame[contains(@src,'frame2')]")
driver.switch_to.frame(frame2)
4.注意:如果已经切换进入某个frame,接下来想要切换进入其他frame之前,需要先切换回上一级页面,或切换回默认主页面。
(1)切换回上一级页面
driver.switch_to.parent_frame()2)切换回默认主页面
driver.switch_to.default_content()
unittest

1.新建unittest的测试类的步骤:
(1)导入unittest模块
(2)新建Python file时,选择Kind为Python unit test,可以自动生成一些代码,这里的类一定要继承自unittest模块中的TestCase类。
(3)覆盖setUp函数,实现一些初始化的操作步骤,例如连接数据库、读取外部文件、启动浏览器等。
(4)编写test开头的函数(称为测试函数),实现具体的测试步骤,这样的函数可以有1到多个。
(5)在测试函数中使用unittest所提供的断言方法,实现数据的检查。
(6)覆盖tearDown函数,实现一些收尾步骤,例如关闭数据库连接、释放资源、关闭浏览器等。
(7)在程序执行入口调用unittest提供的main函数。
2.unittest的测试套件,可以实现测试用例的批量运行
(1)准备测试用例中的测试函数
(2)新建测试套件对象
suite=unittest.TestSuite()
(3)向测试套件中添加测试用例
示例:suite.addTest(TestCount(“test_add1”))
(4)新建测试运行器对象
runner=unittest.TextTestRunner()
(5)调用运行器的runner实现测试套件的批量运行
示例:runner.run(suite)

总体示例:
if __name__ == "__main__":
    suite=unittest.TestSuite()
    suite.addTest(TestCount("test_add1"))
    suite.addTest(TestCount("test_add2"))
    suite.addTest(Tc8001("test_tc8001"))
    runner=unittest.TextTestRunner()
    runner.run(suite)

3…通过默认加载器来加载指定路径下的某规则模块名称的所有模块来批量运行。

import unittest
ts_dir='./'
ts1=unittest.defaultTestLoader.discover(ts_dir,pattern='tc*.py')

if __name__=="__main__":
    runner=unittest.TextTestRunner()
    runner.run(ts1)

4.unittest提供的断言方法:
在这里插入图片描述
5.测试类优化
1)新建MyTest类,继承自unittest.TestCase类,实现setUp和tearDown或其他一些通用函数。
示例:
import unittest
from selenium import webdriver

class MyTest(unittest.TestCase):

def setUp(self):
    self.driver=webdriver.Firefox()
    self.driver.implicitly_wait(20)
def tearDown(self):
    self.driver.quit()

(2)新建Python file,选择Python unit test类型,新建测试类后,修改父类为MyTest类,这样就可以不用在测试类中书写通用函数,只书写测试函数test_xxx即可。

测试框架设计

1.PageObject设计模式:
(1)设计思想:将每个网页都封装为一个对象,将该网页内的操作动作都封装为函数,也可以将所有的定位都封装到另一个描述定位方法的类中,而测试类只需要关于业务,不必关注网页实现细节。
(2)案例:02-seleniumday08(for student)/demo01.html
2.详细设计:
(1)定位:day0802包里demo01_v1_locator.py
(2)操作模块:day0802包里demo01_v1_register.py
(3)测试业务:day0802包里demo01_v1_testing.py
3.从csv读取测试数据
(1)导入csv
import csv
(2)读取csv数据
示例:
# 读取csv文件中的数据
f=open(‘D:/mydata1.csv’,‘r’)
d=csv.reader(f)
for row in d:
self.mc.type_name(row[0])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值