首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python3+Selenium高阶自动化详细实战

#在做自动化测试的时候,某个页面元素,

# 你需要移动鼠标到上面才能显示,

# 那么我们需要使用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()

点击点来点去就完事

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210214A07LJ300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券