自动化测试—selenium框架

selenium框架

1 安装

命令描述
pip install selenium==2.48.0安装2.48.0版本的selenium包
pip uninstall selenium卸载已安装的selenium包
pip show selenium查看已安装的selenium包信息

备注:浏览器版本及selenium版本信息
浏览器驱动下载地址: http://www.seleniumhq.org/download/ (浏览器驱动下载好后需要添加Path环境便令中,或者直接放到Python安装目录)

浏览器版本selenium版本
FireFox 48以上版本Selenium 3.X + FireFox驱动(geckodriver)
Firefox 48 以下版本Selenium2.X + FireFox内置驱动
IE 9以上版本Selenium3.X +IE驱动
IE 9以下版本Selenium 2.X +IE驱动
Chromeselenium2.x/3.x +Chrome驱动

2 使用

步骤1: 创建浏览器对象

模块导入:from selenium import webdriver
创建浏览器对象:driver = webdriver.Firefox ()

步骤2: 获取指定页面

打开url,获取页面:driver.get(url)

命令描述
maximize_window()将浏览器最大化
set_window_size(size1,size2)设置浏览器大小,即浏览器宽、高像素点的设置
set_window_position(position1,position2)设置浏览器的位置
back()模拟浏览器的后退按钮
forward()模拟浏览器的前进按钮
refresh()模拟浏览器F5刷新
close()模拟浏览器关闭按钮(关闭单个窗口)
quit()模拟浏览器关闭按钮(关闭所有窗口)
步骤3: 元素操作及定位
3-1: 元素操作
命令描述
driver.current_url获取当前页面url
driver.title获取title值
driver.text获取元素的文本
driver.get_attribute("xxx")获取元素的属性值
el.send_keys(value)为指定元素输入值(el表示某个元素)
el.clear()清除元素的文本内容(el表示某个元素)
el.click()单击元素(el表示某个元素)
3-2: 元素定位–根据元素属性定位
命令描述
driver.find_element_by_id("id值")根据元素的id属性进行元素定位
driver.find_element_by_name("name值")根据元素的name属性进行元素定位
driver.find_element_by_class_name("class属性值")根据元素的class属性进行元素定位
driver.find_element_by_tag_name("标签名")根据元素的标签名进行元素定位
3-3: 元素定位–超链接元素定位
命令描述
driver.find_element_by_link_text("值")根据超链接a标签的文本内容进行元素精确定位
driver.find_element_by_partial_link_text("值")根据超链接a标签的文本内容进行元素模糊定位
driver.find_element_by_link_text("值").text获取超链接a标签的内容
driver.find_element_by_link_text("值").get_attribute("href")获取超链接a标签的href属性值
3-4: 元素定位–根据元素路径定位
命令描述
driver.find_element_by_xpath("//input[@id='kw']")快速定位元素,利用元素唯一属性;
driver.find_element_by_xpath("//*[@id='p1']/input")层级与属性结合–要找的元素无属性,但是其父级有;
driver.find_element_by_xpath("//*[@id='telA' and @class='telA']")属性与逻辑结合:解决元素之间个相同属性重名问题
driver.find_element_by_xpath("//*[text()='xxx']")定位文本内容是xxx的元素
driver.find_element_by_xpath("//*[starts-with(@attribute,'xxx')]")定位属性以xxx开头的元素
driver.find_element_by_xpath("//*[contains(@attribute,'xxx')]")定位属性中含有xxx的元素
3-5: 元素定位–根据CSS选择器定位
命令样例描述
driver.find_element_by_css_selector(".class").intro选择class属性="intro"的所有元素
driver.find_element_by_css_selector("#id")#name选择id属性=”name“的所有元素
driver.find_element_by_css_selector("element")p选择p标签的所有元素
driver.find_element_by_css_selector("*")*定位所有的元素
driver.find_element_by_css_selector("element1,element2")div,p选择所有div元素和所有p标签元素
driver.find_element_by_css_selector("element1 element2")div p选择div元素内部所有的p标签元素
driver.find_element_by_css_selector("element1>element2")div>p选择父元素为div的所有p标签元素
driver.find_element_by_css_selector("element1+element2")div+p选择紧跟在div元素后的所有p标签元素
driver.find_element_by_css_selector("[attribute]")[target]选择带target属性的所有元素
driver.find_element_by_css_selector("[attribute=value]")[target=test]选择所有使用target="test"的元素
driver.find_element_by_css_selector("[attribute~=value]")[title~=name]选择title属性包含单词"name"的所有元素
driver.find_element_by_css_selector("[attribute^=value]")a[src^=“name”]选择其src属性值以"name"开头每个a标签元素
driver.find_element_by_css_selector("[attribute$=value]")a[src$=“name”]选择其src属性值以"name"结尾每个a标签元素
driver.find_element_by_css_selector("[attribute*=value]")a[src*=“name”]选择其src属性值中包含"name"的每个a标签元素
driver.find_element_by_css_selector(":only-child")p:only-child选择每个p元素是其父级的唯一子元素
driver.find_element_by_css_selector(":nth-child(n)")p:nth-child(2)选择每个p元素是其父级的第二个子元素
driver.find_element_by_css_selector(":nth-last-child(n)")p:nth-last-child(2)选择每个p元素的是其父级的第二个子元素,从最后一个子元素开始计数
driver.find_element_by_css_selector(":empty")p:empty选择无子元素的每个p标签元素
3-6: 元素定位–find_element()

导包:from selenium.webdriver.common.by import By

命令描述
driver.find_element(By.ID,"kw").send_keys("python")查找id=“kw"的元素,并填入内容"python”
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys("python")查找id=“kw"的元素,并填入内容"python”
driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('python')查找id=“kw"的元素,并填入内容"python”
driver.find_element(By.NAME,"用户名标签name属性值").send_keys("123456")查找id="***“的元素,并填入内容"123456”
driver.find_element(By.CLASS_NAME,"用户名标签class属性值").send_keys("181111")查找class="***“的元素,并填入内容"181111”
driver.find_element(By.TAG_NAME,'input').send_keys("python")查找input标签,并填入内容"python"
driver.find_element(By.LINK_TEXT,'hao123').click()查找关于“hao123”的链接,并点击打开
driver.find_element(By.PARTIAL_LINK_TEXT,'hao').click()查找含有“hao”的链接,并点击打开

备注:find_element_by_xxx底层实现方法,是调用的By类方法进行的封装;

3-7: 元素等待
  • 显示等待:
  1. 导包等待类:from selenium.webdriver.support.wait import WebDriverWait
  2. 导包判断条件:from selenium.webdriver.support import expected_conditions as EC
  3. WebDriverWait(driver, timeout, poll_frequency=0.5)
    1). driver:浏览器对象
    2). timeout:超时的时长,单位:秒
    3). poll_frequency:检测间隔时间,默认为0.5秒
  4. 调用方法 until(method):until(EC.presence_of_element_located(element))
    样例
  • 隐式等待:
    方法:implicitly_wait(timeout) (timeout:为等待最大时长,单位:秒)
    调用:driver.implicitly_wait(10) (driver:为浏览器实例化对象名称)
3-8: 窗口及表单切换
  • 多窗口切换
    handles = driver.window_handles   
    driver.switch_to.window(handles[n])
    driver.current_window_handle       #"获取当前窗口句柄"
    driver.window_handles              #"获取所有窗口句柄"
    driver.switch_to.window(handle)    #"切换指定句柄窗口"
    
  • frame表单切换
    a)若iframe具有id属性,直接使用id属性值切换进内层页面:
    driver.switch_to.frame(value)  #方法一
    driver.switch_to_frame(value)  #方法二
    
    b) 定位到iframe元素,再切换进入:
    el = driver.find_element_by_xxx(value)
    driver.switch_to.frame(el)             # 或者使用driver.switch_to_frame(el)
    driver.switch_to.default_content()     #恢复默认页面方法
    driver.switch_to.parent_frame()        #进行向上的单层切换
    
    在这里插入图片描述
3-9: 鼠标及键盘操作
  • 鼠标方法

    1. 导入ActionChains类:from selenium.webdriver import ActionChains
    2. 创建ActionChains对象,参数为浏览器对象:action = ActionChains(driver)
    3. 定位到要进行鼠标操作的元素并向ActionChains对象添加动作
      el = driver.find_element_by_xxx(“value”)
      action.move_to_element(el)           # 悬停 --> 此方法模拟鼠标悬停效果
      action.context_click(username)       # 右击 --> 此方法模拟鼠标右键点击效果
      action.double_click(username)        # 双击 --> 此方法模拟双标双击效果
      
    4. 顺序执行保存在队列中的操作:action.perform()
  • 键盘操作

    1. 导包:from selenium.webdriver.common.keys import Keys
    2. 常用操作:
      send_keys(Keys.BACK_SPACE)         # 删除键(BackSpace) 
      send_keys(Keys.SPACE)              # 空格键(Space) 
      send_keys(Keys.TAB)                # 制表键(Tab) 
      send_keys(Keys.ESCAPE)             # 回退键(Esc) 
      send_keys(Keys.ENTER)              # 回车键(Enter) 
      send_keys(Keys.CONTROL,'a')        # 全选(Ctrl+A) 
      send_keys(Keys.CONTROL,'c')        # 复制(Ctrl+C)
      send_keys(Keys.CONTROL,'v')        # 粘贴(Ctrl+V)
      
3-10: 下拉选择框、弹窗及滚动条处理
  • 下拉选择框处理

    1. 导包:from selenium.webdriver.support.select import Select
    2. 在页面中定位到下拉框元素: el_sel = driver.find_element_by_xxx(“value”)
    3. 将定位到的下拉框元素构建成为Select对象:selobj = Select(el_sel)
    4. 调用相应方法选择下拉框中的选项
      selobj.select_by_index()        # 通过索引选择,index索引从 0 开始
      selobj.select_by_value()        # 通过value属性值选择(value是option标签的一个属性)
      selobj.select_by_visible_text()    # 通过文本选择(下拉框的值)    
      
    5. 通过属性查看
      first_selected_option        # 第一个被选中的option标签对象
      options                    	    # select标签中option标签构成的列表
      
  • 弹窗处理
    1)获取警告框: alert=driver.switch_to.alert
    2)调用: alert.text (返回alert/confirm/prompt中的文字信息)

    alert.accept()           # 接受对话框选项
    alert.dismiss()          # 取消对话框选项
    
  • 滚动条处理

    1. 设置JavaScritp脚本控制滚动条:
      js="window.scrollTo(x,y)"  #(x:左边距;y:上边距;单位像素)、
      js= “document.documentElement.scrollTop=n" # n为从顶往下移动滚动距离
      js1="window.scrollTo(0,1000)"   # 最底层 
      js2="window.scrollTo(0,0)"      # 最顶层   
      driver.execute_script(js1)      # 执行最底层  
      driver.execute_script(js2)      # 执行最顶层    
      
    2. WebDriver调用js脚本方法:driver.execute_script(js)
  • 窗口截图:get_screenshot_as_file(imgpath) (imgpath:图片保存路径)

3-11: 验证码

在这里插入图片描述
1). 去掉验证码 (测试环境下-采用)
2). 设置万能验证码 (生产环境-采用)
3). 验证码识别技术 (通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie (通过记录cookie进行登录-推荐)

1. get_cookie(name)    # 获取指定cookie  (name:为健名)
2. get_cookies()       # 获取本网站所有本地cookies
3. add_cookie(str)     # 添加cookie   (str:为python中的字典格式)
4. driver.refresh()      # 调用刷新方法
  • 例子:
    在这里插入图片描述
步骤4: 关闭页面

关闭当前标签/窗口:driver.close()
关闭所有标签/窗口:driver.quit()

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值