TA的每日心情 | 擦汗 昨天 09:02 |
---|
签到天数: 1046 天 连续签到: 4 天 [LV.10]测试总司令
|
相比于高大上的各种Selenium进阶指南,个人认为夯实基础至关重要,本文以一个个小案例的方式将KPI常用接口的使用进行归纳总结,有条件的同学可以自己练习几次,相信会有所收获。
鼠标操作
实现功能:百度页面->移动到‘设置’按钮->右键点击/鼠标双击/鼠标拖拽到元素松开。
·首先导入ActionChains方法
·使用格式:ActionChains(driver).操作(element).perform()
实现代码:
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
sleep(2)
#设置按钮
element=driver.find_element_by_id('s-usersetting-top')
#鼠标移动到设置按钮
ActionChains(driver).move_to_element(element).perform()
#鼠标右键点击元素
ActionChains(driver).context_click(element).perform()
#鼠标双击元素
ActionChains(driver).double_click(element).perform()
#鼠标拖拽到元素松开
ActionChains(driver).drag_and_drop(element).perform()
sleep(2)
|
常见方法:
键盘操作
实现功能:百度搜索框输入selenium->复制内容->sogo搜索框粘贴内容。
·首先导入Keys方法
·使用格式:driver.findelementbyid("kw").sendkeys(Keys.CONTROL,'a')
实现代码:
#导入相关包
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
#打开浏览器
driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
#定位搜素框->输入关键字—>复制
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'c')
sleep(2)
#打开sogo页面->sogo搜索框粘贴内容
driver.get("http://www.sogou.com/")
driver.find_element_by_id("query").send_keys(Keys.CONTROL,'v')
|
Javascript 使用技巧
js在selenium有许多应用,最主要的有滚动条操作。
实现功能:进入百度搜索结果页-》滚动条分别滚到到顶部、底部及指定元素位置。
使用格式:driver.execute_script('window.scrollTo(0,0)')
实现代码:
from selenium import webdriver
from time import sleep
#打开浏览器,进入搜索页面
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_id('kw').send_keys('wer')
driver.find_element_by_id('su').click()
sleep(3)
#滑动到页面底部
driver.execute_script('window.scrollTo(0,10000)')
sleep(3)
# 滑动到页面顶部
driver.execute_script('window.scrollTo(0,0)')
sleep(3)
#滑动到指定元素(通过链接方式)
target = driver.find_element_by_partial_link_text('汽车')
driver.execute_script("arguments[0].scrollIntoView();", target)
sleep(3)
driver.quit()
|
屏幕截图
屏幕截图功能常用的有两种savescreenshot()及 getscreenshotasfile()。
使用格式
·self.driver.save_screenshot('baidu.png')
·self.driver.getscreenshotasfile(filepath)
在项目中用到屏幕截图的地方基本使用场景为测试用例失败后保存失败的截图,帮助定位问题。
实现功能1:百度搜索成功后屏幕截图-通过save_screenshot方法。
实现代码:
#导入相关包
from time import sleep
from selenium import webdriver
class Testcase():
#打开百度
def __init__(self):
self.driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
def test4(self):
self.driver.find_element_by_id('kw').send_keys('nihao ')
self.driver.find_element_by_id('su').click()
sleep(2)
#屏幕截图
self.driver.save_screenshot('baidu.png')
sleep(2)
if __name__ == '__main__':
case=Testcase()
case.test4()
|
实现功能2:百度搜索成功后屏幕截图,保存到指定路径,以当前时间命名。
#导入相关包
from time import sleep
from selenium import webdriver
import os
from time import sleep, time, localtime, strftime
def test4(self):
self.driver.find_element_by_id('kw').send_keys('nihao ')
self.driver.find_element_by_id('su').click()
sleep(2)
#获取当前时间
str=strftime("%Y-%m-%d-%H-%M-%S",localtime(time()))
#png格式命名
file_name=str+'.png'
#获取路径
path=os.path.abspath('screenshot')
#路径名+文件名拼接
file_path=path+'/'+file_name
#截图操作
self.driver.get_screenshot_as_file(file_path)
if __name__ == '__main__':
case=Testcase()
case.test4()
|
iframe切换
应用场景:
在编写脚本的时候,经常会发现最熟悉的错误“元素定位不到“,此时如果你查看页面元素,有可能你会发现元素在>标签对之间,此时,我们只有先将代码驱动切换到frame内部才可定位成功。
使用格式:
实现功能:登录qq邮箱为例,用户名嵌套在iframe弹窗内。
实现代码:
from time import sleep
from selenium import webdriver
class Testwindow(object):
def __init__(self):
self.driver=webdriver.Chrome()
self.driver.get('https://mail.qq.com/')
self.driver.implicitly_wait(5)
def login(self):
#进入iframe
self.driver.switch_to.frame('login_frame')
sleep(1)
#输入账号、密码
self.driver.find_element_by_id('u').send_keys('635907412@qq.com')
self.driver.find_element_by_id('p').send_keys('wangxinlibingzhi')
self.driver.find_element_by_id('login_button').click()
self.driver.quit()
if __name__ == '__main__':
#实例化类
test=Testwindow()
#调用登录功能
test.login()
|
窗口句柄
应用场景:当单击主页上的链接时,将打开一个新窗口。在新打开的窗口中,无法执行任何操作,因为焦点仍然在主页Web驱动程序上
这时候,我们需要把焦点定位到新打开的页面上。
·现获取所有窗口 a=driver.window_handles
·再获取最新打开的窗口driver.switch_to.window(a[-1])
这里有一点不一样有时候handles【1】里面的数字是1或者-1都可以。
实现功能:百度页面,打开x超链接,在新窗口下拉滚动条。
实现代码:
#导入相关包
from time import sleep
from selenium import webdriver
#定义一个类
class Testwindow(object):
#定义初始化函数
def __init__(self):
self.driver=webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
self.driver.implicitly_wait(5)
#定义初始化函数,打开x超链接,在新窗口下拉滚动条
def link(self):
self.driver.find_element_by_partial_link_text('2021').click()
#获取窗口句柄
a=self.driver.window_handles
self.driver.switch_to.window(a[1])
sleep(3)
self.driver.execute_script('window.scrollTo(0,10000)')
sleep(1)
self.driver.quit()
if __name__ == '__main__':
test=Testwindow()
test.link()
|
警告弹 -alert/confirm/promp
应用场景:有些页面进入后自带弹窗提醒功能需要确认,这时候就需要将焦点定位到alert弹窗上。
使用格式:
alert=driver.switchtoalert()
alert.accept()
|
实现功能:本地新建html文件,模仿alert/confirm/prompt弹窗,定位弹窗并确认
实现代码:
新建alert.html,生成弹窗效果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<a href="javascript:alert('提示框')" id="alert">Alert</a><br>
<a href="javascript:confirm('真的要删除数据么' )" id="confirm">confirm</a><br>
<a href="javascript:var age = prompt('请输入数据');document.write(age)" id="prompt">prompt</a><br>
</body>
</html>
#导入相关包
import os
from time import sleep
from selenium import webdriver
class Testcase(object):
#打开弹窗页面
def __init__(self):
self.driver=webdriver.Chrome()
#获取html页面路径地址
path=os.path.dirname(os.path.abspath(__file__))
file_path='file:///'+path+'/test_alert.html'
self.driver.get(file_path)
#alert弹窗
def alert(self):
self.driver.find_element_by_id('alert').click()
#定位到alert弹窗
alert=self.driver.switch_to.alert
#弹窗确认
alert.accept()
sleep(2)
#生成confim弹窗
def confirm(self):
self.driver.find_element_by_id('confirm').click()
confirm=self.driver.switch_to.alert
confirm.accept()
|
附件上传
实现功能:拖拽图片到百度上传图片搜索功能区域。
使用格式:
定位.send_keys(r'图片路径')
#导入相关包
from selenium import webdriver
from time import sleep
#打开百度
driver=webdriver.Chrome()
driver.get('http://www.baidu.com')
#定位+按钮
driver.find_element_by_class_name('soutu-btn').click()
sleep(1)
#打开指定位置的图片
driver.find_element_by_class_name('upload-pic').send_keys(r'F:\\wx\\PyCharm Community Edition 2018.1.3\\zdh\\1.jpg')
|
时间等待
常见的时间等待有三种:固定、显示、隐士
应用场景:主要用于模拟真实的用户操作,有时时间过于短,页面响应不过来,从而造成元素定位不到
使用格式:
·sleep(3):一般用于调试
·implicity_wait():隐士等待一般对整个driver周期都适用,使用一次即可
·WebDriverWait(self.driver,2 ).until(EC.title_is('百度一下,你就知道')):这种最常用,一般是指某个元素出现了等待就结束
实现功能:打开百度页面,等到页面标题出现再进行搜索操作。
代码实现:
#导入包
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
#定义一个类
class Testcase(object):
#打开浏览器
def __init__(self):
self.driver=webdriver.Chrome()
self.driver.get('https://www.baidu.com/?tn=88093251_33_hao_pg')
#定义函数,实现显示等待
def test_wait(self):
WebDriverWait(self.driver,2 ).until(EC.title_is('百度一下,你就知道'))
self.driver.find_element_by_id('kw').send_keys('自动化测试')
#调用函数
if __name__ == '__main__':
case=Testcase()
case.test_wait()
|
|
|