web自动化测试之Selenium

一、Selenium自动化测试框架

1.什么是框架?

  • 框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题
  • 框架是整个或部分系统的可重用设计
  • 框架,其实就是某种应用的半成品

2.为什么使用框架?

  • 自己从头实现太复杂
  • 使用框架能够更专注于业务逻辑,加快开发速度
  • 框架的使用能够处理更多细节问题
  • 使用人数多,稳定性,扩展性好

3.selenium的webdriver工作原理?

①脚本运行后,会打开指定浏览器,webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的remote server,接收测试脚本的命令

②客户端(即测试脚本)通过ComandExecutor发送HTTP请求给Server

③webdriver通过浏览器的原生组件,转化Web Service的命令为浏览器的native的调用来完成操作

④用户操作Web Application的过程

4.安装selenium框架:pip install selenium==2.48.0(低版本较稳定)

二、Selenium API基础

1.浏览器驱动对象

①库的导入

from selenium import webdriver

②创建浏览器对象:driver = webdriver.xxx()

driver=webdriver.Firefox()
#谷歌浏览器需要导入chromedriver.exe驱动,驱动版本和浏览器版本一致
driver=webdriver.Chrome("路径\chromedriver.exe")

③浏览器尺寸的相关操作

#浏览器窗口最大化
driver.maximize_window()
#获取浏览器窗口尺寸
print(driver.get_window_size())
#设置浏览器窗口尺寸
driver.set_window_size(500,500)

④浏览器位置相关操作

#获取浏览器在屏幕显示的位置
print(driver.get_window_position())
#设置浏览器在屏幕显示的位置
driver.set_window_position(5,5)

⑤浏览器的关闭操作

#关闭当前窗口
driver.close()
#关闭所有窗口
driver.quit()

⑥页面请求操作

#访问url,获取响应
driver.get("https://www.baidu.com")
#刷新当前页面
driver.refresh()
#访问另一个url,获取响应
driver.get("https://www.taobao.com/")
#回退到百度的页面
driver.back()
#前进到之后的页面
driver.forward()

2.获取断言信息的操作

①获取当前页面url

print(driver.current_url)

②获取当前浏览器标题

print(driver.title)

③通过流截取当前页面

pic=driver.get_screenshot_as_png()
with open("baidu.png","wb") as f:
    f.write(pic)

④直接截取当前页面

driver.get_screenshot_as_file("baidu.png")

⑤输出网页源码信息

print(driver.page_source)

3.元素定位(两种方式)

直接调用型(推荐):driver.find_element_by_xxx(value)

#1.按id定位
findById=driver.find_element_by_id("kw")
findById.send_keys("12306")
#2.按name定位
findByName=driver.find_element_by_name("wd")
findByName.send_keys("10086")
#3.通过伪类名class定位
findByClass=driver.find_element_by_class_name("s_ipt")
findByClass.send_keys("4399")
#4.通过链接文本定位(必须是完整名称) link text
findByLinkText=driver.find_element_by_link_text("新闻")
findByLinkText.click()
#5.通过部分链接文本定位(模糊查询) partial link text
#若有多个符合匹配项,则执行从上到下从左到右的第一个
findByPartial=driver.find_element_by_partial_link_text("新")
findByPartial.click()
#6.xpath路径表达式
findByXpath=driver.find_element_by_xpath('//*[@id="kw"]')
submit=driver.find_element_by_xpath('//*[@id="su"]')
findByXpath.send_keys("刘耀文")
submit.click()
#7.css选择器定位
findByCss=driver.find_element_by_css_selector("#kw")
submit=driver.find_element_by_css_selector("#su")
findByCss.send_keys("邓紫棋")
submit.click()
#8.标签名定位(用的较少) tag name
#案例:必应搜索
driver.get("https://cn.bing.com")
findByTagName=driver.find_element_by_tag_name("input")
submit=driver.find_element_by_tag_name("circle")
findByTagName.send_keys("Ariana Grande")
submit.click()

②使用By类型(需先导入By):driver.find_element(By.xxx,value)

from selenium.webdriver.common.by import By

#通过By类型的id
findById=driver.find_element(By.ID,"kw")
findById.send_keys("测试")

4.元素的操作

  • 点击操作:element.click()
  • 清空输入文本:element.clear()
  • 输入文本:element.send_keys(data)

三、Selenium API高级

1.多标签/窗口之间的切换

场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面,这种情况下,计算机需要识别多标签或窗口的情况

①获取所有窗口的句柄:handles = driver.window_handles

  • 调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的句柄存放在里面

通过窗口的句柄进入的窗口:driver.switch_to.window(handles[n])

  • 通过窗口句柄激活进入某一窗口,只有切换句柄才能对该句柄对应的窗口进行操作

2.多表单之间的切换

场景:在网页中,表单嵌套是很常见的情况,尤其是登录

①什么是多表单:实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看得到,简单理解就是页面中开了一个窗口显示另一个页面

②处理方法:

  • 方式一:直接通过id值切换表单
driver.switch_to.frame(id_value)
  • 方式二:定位到表单元素再切换
el = driver.find_element_by_xxx(el_value)
driver.switch_to.frame(el)

3.弹出框操作

#进入到弹出框
driver.switch_to.alert
#确认弹出框信息
driver.switch_to.alert.accept()
#取消弹出框信息
driver.switch_to.alert.dismiss()
#发送文本到弹出框
driver.switch_to.alert.send_keys(data)

4.滚动条操作 

from selenium import webdriver
import time

driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
driver.maximize_window()
#访问58
driver.get("https://bj.58.com/")

time.sleep(2)
#scrollTo(xpos,ypos),x坐标和y坐标,位于窗口左上角
#滚动条向下拉600xp
js="window.scrollTo(0,600)"
driver.execute_script(js)
time.sleep(2)
#滚动条回到最底部(两种方式)
bottom="window.scrollTo(0,document.body.scrollHeight)"
#bottom="var q=document.documentElement.scrollTop=10000"
driver.execute_script(bottom)
time.sleep(2)
#滚动条回到最顶部(两种方式)
top="window.scrollTo(0,0)"
#top="var q=document.documentElement.scrollTop=0"
driver.execute_script(top)
time.sleep(2)
#滚动到指定元素位置(最常用)
target=driver.find_element_by_xpath('//*[text()="IT|互联网"]')
driver.execute_script("arguments[0].scrollIntoView();",target)

5.鼠标操作

from selenium import webdriver
#导入动作链类,动作链可以储存鼠标的动作
from selenium.webdriver import ActionChains
import time

driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
driver.maximize_window()
#访问百度
driver.get("https://www.baidu.com/")

time.sleep(2)
#定位到“更多”
more=driver.find_element_by_xpath('//*[text()="更多"]')

time.sleep(2)
#鼠标悬停在“更多”
ActionChains(driver).move_to_element(more).perform()
time.sleep(2)
#鼠标右击“更多”
ActionChains(driver).context_click(more).perform()
time.sleep(2)
#鼠标左击“更多”
ActionChains(driver).click(more).perform()

6.键盘操作

from selenium import webdriver
#键盘操作使用的是Keys类,一般配合send_keys使用
from selenium.webdriver.common.keys import Keys
import time

driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
driver.maximize_window()
#访问百度
driver.get("https://www.baidu.com/")

time.sleep(2)
#定位到输入框
input_box=driver.find_element_by_id("kw")
input_box.send_keys("刘耀文2")
time.sleep(2)
#删除键(Backspace)
input_box.send_keys(Keys.BACK_SPACE)
time.sleep(2)
#回车键(Enter)
input_box.send_keys(Keys.ENTER)
  • send_keys(Keys.SPACE)              空格键(Space)
  • send_keys(Keys.TAB)                   制表键(Tab)
  • send_keys(Keys.ESCAPE)           回退键(Esc)
  • send_keys(Keys.CONTROL,'a')    全选(Ctrl+A)
  • send_keys(Keys.CONTROL,'x')    剪切(Ctrl+X)
  • send_keys(Keys.CONTROL,'v')    粘贴(Ctrl+V)
  • send_keys(Keys.F1)                      键盘 F1
  • ……
  • send_keys(Keys.F12)                    键盘 F12

7.等待

①强制等待:表示强行等待n秒再执行下一句代码,时间到了就会执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。而且如果等待的元素已经被加载出来,还需要等待时间结束才会执行下一句,浪费时间

  • from time import sleep 或者 import time

②隐式等待:表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。

  • 注:
  • driver.implicitly_wait(30)
  • 隐式等待的作用域是全局,所以一般设置在整局代码的头几行。
  • 隐式等待采用全部设置,也就是说,你所有的findElement方法都会最多等待30秒

③显式等待:显示等待明确要等到某个元素的出现,在设置时间内每隔x秒去判断一下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,直到时间截止。如果超时就会抛出异常。

  • 导入显性等待的包:from selenium.webdriver.support.wait import WebDriverWait
  • 判断所需要的元素是否已经被加载出来:from selenium.webdriver.support import expected_conditions as EC
  • 定位:from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time,unittest

class TestWaitClass(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.driver = webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
        cls.driver.maximize_window()
        #访问百度
        cls.driver.get("https://www.baidu.com/")
        #隐式等待
        # cls.driver.implicitly_wait(30)

    def test001(self):
        driver=self.driver
        #强制等待
        # time.sleep(10)
        #显式等待
        WebDriverWait(driver,10,1).until(EC.presence_of_element_located((By.ID,"kw")))
        #定位搜索栏
        driver.find_element_by_id("kw").send_keys("如懿传")

你可能感兴趣的:(selenium,web自动化,python,测试)