#在做自动化测试的时候,某个页面元素,
# 你需要移动鼠标到上面才能显示,
# 那么我们需要使用Actionchains来处理这些
#动作链可以对鼠标才能进行的情况,比如 双击 点击 拖拽:
#click单击鼠标左键
#click_and_hold点击鼠标左键不放开
#context_click点击鼠标右键
#double_click双击
#drag_and_drop(source,target)拖拽到某个元素放开
#drag_and_drop_by_offset(source,x,y)拖拽到坐标然后放开
#key_down(value,element)按下某个键
#key_up(value,element)放开某个键
#move_by_offset(x,y)鼠标从当前位置移动到某个坐标
#move_by_element(to_element)鼠标移动到某个元素
#move_to_element_with_offset(to_element,x,y)
#移动到某个元素(坐标)位置
#perform()执行动作
#release(element)某个元素位置取消左键
#send_keys(*keys_to_send)发送某个键到当前焦点的元素
#send_keys_to_element(ele,*keys_to_send)
#指定元素发送到某个键
from selenium import webdriver
import time
www = webdriver.Chrome()
url = "https://liushilive.gitee.io/html_example/index1.html"
www.get(url)
www.maximize_window()
#隐藏元素
www.refresh()
www.implicitly_wait(10)
first = www.find_elements_by_xpath('//*[text()="我出来啦"]')
print(first)
# 单击
ele1 = www.find_element_by_id("click").click()
#双击
ac = webdriver.ActionChains(www)
ac.double_click(ele1)
ac.perform()
# 多选框
ele2 = www.find_element_by_id("c1")
ele3 = www.find_element_by_id("c2")
# input控件有多个元素
inputs = www.find_elements_by_tag_name('input')
#使用每个控件进行循环
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
www.find_elements_by_css_selector('input[type=checkbox]').pop().click()
#找到元素选择type=checkbox的进行删除点击 再次点击删除
time.sleep(2)
#单选框
ele4 = www.find_element_by_css_selector("input[value='option1']")
selected=ele4.is_selected()#判断是否被选中
if selected:
print('已经选中了')
else:
print('没有选中')
ele4.click()
这个太基础直接用input然后if语句就行
#下拉列表
#下拉框点击
ele5 = www.find_element_by_id("s1Id").click()
ele6 = www.find_element_by_xpath("//option[@value='bj']").click()
ele5.click()
#在一个下拉框里选对象
ele100 = www.find_element_by_id("s1Id")
select1 = Select(ele100) #得到对象
# select1.select_by_value("sz")#通过option的value选择
# select1.select_by_index(2)#下标选择
select1.select_by_visible_text("上海")#可见文本选择
#多选下拉框
ele7 = www.find_element_by_id("s3Id")
select2 = Select(ele7)
print(select2.is_multiple)#是否支持多选 否返回none
print(select2.options)#选项列表
select2.select_by_index(0)
select2.select_by_index(1)
select2.select_by_index(2)#选择
print(select2.all_selected_options)#已经被选中的
select2.deselect_by_index(2) #取消2下标选择
select2.deselect_all()#取消所有
#处理警告框 页面有的话要优先处理
#点击警告框
ele8 = www.find_element_by_id("b1").click()
#切换到警告框
alert = www.switch_to.alert
#警告框文本
print(alert.text)
#点击确定按钮
alert.accept()
#点击了取消
alert.dismiss()
#双击
ele9 = www.find_element_by_id("dblclick")
double = webdriver.ActionChains(www)
double.double_click(ele9)
double.perform()
# 悬浮 多级下拉菜单
ele10 = www.find_element_by_xpath('//*[text()="分 类"]')
webdriver.ActionChains(www).move_to_element(ele10).perform()
# 移动到其他元素上
ele11 = www.find_element_by_xpath('//*[text()="页面重构"]')
webdriver.ActionChains(www).move_to_element(ele11).perform()
偏移量悬浮
webdriver.ActionChains(www).move_by_offset(x,y)
#拖动滑块
ele12 = www.find_element_by_class_name("handler")
ele13 = www.find_element_by_class_name("drag_text")
ele13width = ele13.size["width"]
#拖住(滑块,x,y)执行
time.sleep(3)
webdriver.ActionChains(www).drag_and_drop_by_offset(ele12,ele13width,0).perform()
一次性滑到底会让其识别 非人为操作
# #人为操作
ele14 = www.find_element_by_class_name("drag_text")#框
width = ele14.size["width"]#宽度 注意size是中括号
# ele15 = www.find_element_by_class_name("handler")
# ele15 = www.find_element_by_class_name("handler.handler_bg")
# 通过class方法只能一个class值可以换xpath
# 空格其实是把两个名字隔开了,你只用空格左边或者右边的名字就能找到这个元素。
# by_class_name("handler ......")
ele15 = www.find_element_by_xpath("//*[@id='drag']/div[3]")#滑块
#按住模块执行
webdriver.ActionChains(www).click_and_hold(ele15).perform()
for i in range(10):
webdriver.ActionChains(www).move_by_offset(width/10,0).perform()#执行滑动10次,y坐标不动
time.sleep(0.1) #慢点
webdriver.ActionChains(www).release().perform() #滑动成功释放
#拖换方块
ele16 = www.find_element_by_xpath("/html/body/div[12]/div/div/div[1]")#方块1
ele17 = www.find_element_by_xpath("/html/body/div[12]/div/div/div[2]")#方块2
webdriver.ActionChains(www).drag_and_drop(ele16,ele17).perform()#方块交换
#上传文件方法 input标签:
uploadfile = www.find_element_by_id("upload")#上传的xpath
uploadfile.send_keys('D:\\12345\\PDF\\ReadMe.htm')#直接路径
print(uploadfile.get_attribute('value'))#查看上传文件
#非input上传
# NO 1:首先推荐pywin32库上传:
#我们首次都需要pip install pywin32
import win32gui
import win32con
uploadfile1 = www.find_element_by_id("upload")
uploadfile1.click()#点击上传
time.sleep(1)#等待
#win32gui操作
dialog = win32gui.FindWindow('param1','param2')
[0] 需要传入的窗口类名
[1] 需要传入窗口的标题
键盘行为
ComboBoxEx32 = win32gui.FindWindowEx(dialog,0,'ComboBoxEx32',None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32,0,'ComboBox',None)
Edit = win32gui.FindWindowEx(ComboBox,0,'Edit',None)
handle1=win32gui.FindWindowEx(父窗口句柄,0,None, '') #找到第一个为名为''的子窗口句柄
handle2=win32gui.FindWindowEx(父窗口句柄,handle1,None, '')
#找到下一个为名为''的子窗口句柄依次循环寻找
直到直到Edit对象的句柄
button = win32gui.FindWindowEx(dialog,0,'Button',None)#确定button按钮
win32gui.SendMessage(Edit,win32con.WM_COMMAND,1,button)#按Button
print(uploadfile1.get_attribute('value'))
# NO 2: 通过sendkeys库直接输入信息,不过注意打开窗口要加等待时间,
#否则第一个字母send不进去(或者在地址前面加个无用字符)不稳定不推荐
# import win32gui
# import win32con
# uploadfile2 = www.find_element_by_id('upload')
# uploadfile2.click()
# time.sleep(2)
#
# SendKeys.SendKeys('D:\\xxx.py')#文件
# SendKeys.SendKeys("") #回车键
# NO 3:keybd_event
#win32api 提供了一个keybd_event()方法模仿按键
# 太麻烦了 不稳定 不推荐
# NO 4:AutoIt
# 对于os框进行上传下载等
# 1.使用autoit获取对象 编辑脚本:
# controlfoucus(....)
# Winwait(...)
# controlset text(...)
# sleep(1000)
# controlclick(....)
#2.通过Aut2exe工具把脚本转换exe文件(upfile.exe)使用cmd测试能否打开
#3.用python写os模块调用文件
# import os
# www.find_element_by_id("file").click()
# time.sleep(1)
#
# os.system('C:\\Destop\\upfile.exe "C:\\file.html"')
# #对他进行参数化 使用py脚本调用
#
# time.sleep(3)
# www.quit()
#列表
#获取所有表格对象
ul = www.find_element_by_xpath('//*[@id="recordlist"]').text
li = www.find_elements_by_xpath('//*[@id="recordlist"]/li')
for i in li:
print(i.text)
写个递归,可打印无限极列表
#表格
# 复杂且锻炼逻辑写法:
#id定位获取表格对象
table = www.find_element_by_id("t4")
#标签定位所有行
trlist = www.find_elements_by_tag_name("tr")
print(len(trlist)) #一共8个行
for row in trlist:
tdlist = www.find_elements_by_tag_name("td")#列单元格所有对象
for col in tdlist:
print(col.text +'\t',end=' ')
print('\n')
向后延伸
# 简单写法:
table1 = www.find_element_by_id("t4")
trlist1 = www.find_elements_by_tag_name("tr")
for i in trlist1:
print(i.text,"\t")
#日期选择器
# TIPs:日期控件如果有readonly需要使用js删除 手动输入sendkeys
# 删除
document.getElementByItt("date") #定位
document.getElementById("date").removeAttirbut("readonly") #回车
js ='document.getElemntById("date").removeAttribute("readonly")'
# # 执行
www.execute_script(js)
www.find_element_by_id("date").clear()
#www.find_element_by_id("date").send_keys("2002-8-5")
www.find_element_by_css_selector("[y='2002',m='5',d='3'].click()")
#日期选择器
用js和send操作就行
from selenium import webdriver
www = webdriver.Chrome()
url = "https://liushilive.gitee.io/html_example/index1.html"
www.get(url)
www.maximize_window()
frame1 = www.find_element_by_name("frame1") #切换内层框架
www.switch_to.frame(frame1)
ele100 = www.find_element_by_name("diskno").click()#查找内层元素
#切换回父页面
www.switch_to.parent_frame()
#切换默认网页
www.switch_to.default_content()
点击点来点去就完事
领取专属 10元无门槛券
私享最新 技术干货