Selenium
selenium安装
- webdriver
- IDE
- GRIDE
通过pip安装selenium
pip install selenium
driver下载
淘宝镜像
下载对应版本的driver
环境配置
- python环境
- selenium环境
- 下载浏览器对应的driver版本
- driver配置环境变量【将driver的地址配置到环境变量PATH中】
- 在python中import对应的依赖
from selenium import webdriver
def test_selenium():
driver = webdriver.Chrome()
driver.get("https:/www.baidu.com/")
多窗口
获得窗口的唯一用句柄,切换句柄就接换成窗口
多窗口处理流程
- 先获取当前窗口的句柄
driver.current_window_handle
- 再获取所有窗口句柄
driver.window_handles
- 判断是否是想要操作的窗口,如果是就操作,如果不是就跳转到另一个窗口,对另一个窗口进行操作
driver.switch_to_window
例子
from selenium import webdriver
class TestWindows():
def setup(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_window(self):
self.driver.get("http://baidu.com")
self.driver.find_element_by_partial_link_text("登录").click()
self.driver.find_element_by_partial_link_text("立即注册").click()
Windows = self.driver.window_handles
self.driver.switch_to.window(Windows[-1])
alert窗口
使用driver.switch_to.alert()
将driver切换到alert窗口
text
返回(获取)alert/confirm/prompt中的文字信息
accept()
接受现有警告框,点击确定暗流
dismiss()
放弃现有警告框,放弃
send_Keys(keysToSend)
发送文本至警告框
frame介绍
- frame在html中的框架,在html中,所谓的框架就是可以在同一个浏览器中显示不止一个页面。
- 基于html的框架又分为垂直框架和水平框架(cols,rows)
frame分类
- frame标签包含frameset、frame、iframe三种
- frameset和普通标签一样,可以用index、id、name、webelement任一种方式定位frame
- frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作
多frame切换
frame存在两种,一种是嵌套的一种是未嵌套的
driver.switch_to_frame()
根据元素id或者index切换framedriver.switch_to.default_content()
切换到默认framedriver.switch_to.parent_frame()
切换到父级frame
frame嵌套
对于嵌套的先进入到iframe的父节点,再进入子节点,对子节点的对象进行处理和操作。
driver.switch_to.frame("父节点")
driver.switch_to.frame("字节点")
多浏览器
from selenium import webdriver
import os
class Base():
def setup(self):
browser = os.getenv("browser")
if browser == 'firefox':
self.driver = webdriver.Firefox()
elif browser == 'headless':
self.driver = webdriver.PhantomJS()
else:
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(5)
self.driver.maximize_window()
def teardown(self):
self.driver.quit()
等待方式
直接等待、隐式等待、显式等待
直接等待
time.sleep(3) #强制等待三秒钟,线程休眠一定时间
隐式等待
设置一个等待时间,轮询查找元素是否出现,如果没出现就抛出异常
self.driver.implicitly_wait(3) # 隐式等待三秒钟
显式等待
在代码中定义等待条件,当条件发生时才继续执行代码
from selenium.webdriver.support.wait import WebDriverWait
class TestWait:
def test_wait(self):
def wait(x):
return len(self.driver.find_elements(By.XPATH,'//*[@class="table-heading"]')) >= 1
# 如果找到@class="table-heading"的元素 就执行
WebDriverWait(self.driver,10 )until(wait)
上例子中 的wait(x)可以用 expected_conditions.xx来实现
from selenium.webdriver.support import expected_conditions
WebDriverWait(self.driver,10 )until(expected_conditions.element_to_be_clickable((By.XPATH,'//*[@class="table-heading"]'))))
# 如果@class="table-heading"元素可以被点击,就继续
定位
ID定位
find_element_by_id("id名")
find_element(By.ID,'kw').send_keys("阿巴阿巴阿巴")
# 向ID为kw的控件输入"阿巴阿巴阿巴"
find_element(By.ID,'su').click()
# 点击ID为su的控件
XPATH定位
find_element_by_xpath("xpath")
XPATH由四种书写方式:
- 绝对路径方式
/html/body/div/div/div[3]/div/div/form/span/input
- 元素属性方式
//input[@id='kw']
- 父子关系及元素属性混合定位
//form[@id='form']/span/inpout
- 使用逻辑运算符
//input[@id='kw' and @class='su']
from selenium.webdriver.common.by impotr By
self.driver.find_element(By.XPATH,'//*[@title="主题"]').click()
name定位
find_element_by_name("name属性值")
class name定位
find_element_by_class_name("id属性值")
link text定位
find_element_by_link_text("连接的显示文本")
tag name定位
find_element_by_tag_name("标签名")
partal link text定位
find_element_by_partal_link_text("部分链接的显示文本")
css定位
类选择器
find_element_by_css_selector(".sipt")
ID选择器
find_element_by_css_selector("#su")
*
表示全部选择
element选择器
find_element_by_css_selector("p")
父子关系定位
find_element_by_css_selector("form#form > span > input")
属性定位
find_element_by_css_selector("input[name='n1']")
XPATH定位与 CSS定位的对比
操作
鼠标时间webdriver中封装了ActionChains类,可以通过导包来进行调用。
form selenium.webdriver.common.action_chains import ActionChains
悬停
鼠标悬停到目标元素
ActionChains(driver).move_to_element_by_id("元素id").perform()
点击
定位需要点击的元素,使用click()
self.driver.find_element_by_id("元素id").click()
右键
ActionChains(driver).context_click(driver.find_element_by_id("元素id")).perform()
拖拽
先调用ActionChains
,再定义拖拽起点与终点,再执行拖拽。
from selenium.webdriver import ActionChains
from selenium import webdriver
class TestDrag:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_drag(self):
self.driver.get("网址")
drag = self.driver.find_element_by_id("起点id")
drop = self.driver.find_element_by_id("终点id")
action = ActionChains(self.driver)
action.drag_and_drop(drag, drop).perform()
键盘操作
需要先导包form selenium.webdriver.common.keys import keys
输入
文本
self.driver.find_element_by_id("元素id").send_keys("阿巴阿巴阿巴")
删除键
self.driver.find_element_by_id("元素id").send_keys(Keys.Back_SPACE)
空格键
self.driver.find_element_by_id("元素id").send_keys(Keys.SPACE)
制表键
self.driver.find_element_by_id("元素id").send_keys(Keys.TAB)
esc键
self.driver.find_element_by_id("元素id").send_keys(Keys.ESCAPE)
回车键
self.driver.find_element_by_id("元素id").send_keys(Keys.ENTER)
全选
self.driver.find_element_by_id("元素id").send_keys(Keys.CONTROL'A')
复制
self.driver.find_element_by_id("元素id").send_keys(Keys.CONTROL'C')
剪切
self.driver.find_element_by_id("元素id").send_keys(Keys.CONTROL'X')
粘贴
self.driver.find_element_by_id("元素id").send_keys(Keys.CONTROL'V')
清除
self.driver.find_element_by_id("元素id").clear()
查询信息
查询控件是否显示
driver.find_element_by_id("元素id").is_displayed()
查询控件是否可用
driver.find_element_by_id("元素id").is_enabled()
查询控件是否选中
driver.find_element_by_id("元素id").is_selected()
返回信息
返回当前页面url
url=driver.current_url
返回当前页面title
title=driver.title
返回控件的显示文本
text=driver.find_element_by_xpath("xpath").text
获得控件的属性值
text=driver.find_element_by_xpath("xpath").get_attribute("value")
操作浏览器
控制浏览器窗口大小
指定尺寸
driver.set_window_size(1020,1080)
最大化
driver.maximize_window()
最小化
driver.minimize_window()
控制页面的前进后退与刷新
前进
driver.forward()
后退
driver.back()
刷新
driver.refresh()
截屏
driver.save_screenshot(r"e:\sss.png")
driver.get_screenshot_as_file("{}.{}".format("e:/aaa","png"))
关闭浏览器
driver.quit()
selenium执行JS
在selenium中调用js:
- execute_script:执行js
- return:可以返回js的结果
- execute_script:arguments传参
self.driver.execute_script("return document.getElementById('su')")
文件上传
pass
katalon
与selenium IDE 相似,导出python+unitest的脚本,结合unitest使用。
使用
在浏览器工具中添加katalon即可