css定位
CSS:样式,一般页面的展示都是靠css来展示元素的。
css可以通过元素的id、class、标签这三个常规属性直接定位到
#号表示id属性,如:#kw
.表示class属性,如:.s_ipt
直接用tag名称来定位元素,无任何标示符,如:input
# 表示id 例:div#id值
. 表示class 例:div.class值
属性=value 表示属性定位 例:div[id="id值"][style="display:block"]
层级定位
> 子元素 例:div#id>div.class
后代元素 例:div#id div.class(中间有空格)
^= 以XX开头
$= 以XX结尾
*= 包含XX
contains() 包含
示例:
<div id="123_randomId"> <div id="randomId_456"> <div id="123_pattern_randomId">
css="div[id^='123']"
css="div[id$='456']"
css="div[id*='_pattern_']"
css="div:contains(_pattern_)"
xpath定位
绝对定位 相对定位
// : 相对定位
/ : 绝对定位
xpath-基本定位语法
/ 从根节点选取。绝对定位
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 相对定位
. 选取当
.. 选取当前节点的父
@ 选取属
* 通配符。匹配所有
@* 通配符
xpath-定位-函数和逻辑
函数使用:
text():元素的text内容
例://*[@id="XXX"]//p[text()="XXXX"]
例: - 定位到指定的标。
contains(@属性/text(),value):包含函数。
例:contains(@class,"XXXX")、contains(text(),"XXXX")
逻辑运算:
and 表示条件与。
or 表示条件或。
例://div[@class="XXX" and contains(@style,"display:visibility")]
xpath-轴定位语法
轴运算:
ancestor:祖先结点 包括父
parent:父结点
preceding: 当前元素节点标签之前的所有结点。(html页面先后顺序)
preceding-sibling: 当前元素节点标签之前的所有兄弟结点
following: 当前元素节点标签之后的所有结点。(html页面先后顺序)
following-sibling:当前元素节点标签之后的所有兄弟结点
使用语法:
/轴名称::节点名称[@属性=值]
例://div//table//td//preceding::td
较多的应用场景:
页面显示为一个表格样式的数据列。需要通过组合来定位元素
首次登陆的引导页面如何处理?
refresh()
等待操作。
1、强制等待
import time
time.sleep()
sleep(秒)
2、隐性等待
implicitly_wait(秒)
设置最长等待时间,在这个时间内加载完成,则执行下一步。
整个drvier的会话周期内,设置一次即可,全局都可用。
3、显性等待
明确等到某个条件满足之后,再去执行下一步操作。
程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
WebDriverWait类:显性等待类。
WebDriverWait(driver,等待时长,轮循周期).until()/until_not()
expected_conditions模块:提供了一系列期望发生的条件。
presence_of_element_located:元素存在
visibility_of_element_located:元素可见
element_to_be_clickable:元素可点击
ps:这个类有很判断方法。
使用之前,引入相关的库:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
使用方法:
1、先确定元素的定位表达式
web_locator = 'XXXX'
2、调用webdriverWait类设置等待总时长、轮询周期。并调用期until、until_not方法。
WebDriverWait(webdriver对象名,等待总时长,轮询周期).until(判断条件)
3、使用expected_conditions对应的方法来生成判断条件。
EC.类名((定位方式、定位表达式))
例:EC.presence_of_element_located((By.CSS_SELECTOR,web_locator)))
弹出框处理
弹出框有两种:
1、页面弹出框
2、windows弹出框
页面弹出框:
原理:
等待弹出框出现之后,再定位弹出框,再去操作弹出框里的元素。
例:百度登陆的弹出框
Alert弹出框:
1、使用switch_to方法先切换到windows弹出框。
driver.switch_to.alert
2、Alert类提供了一系列的操作方法。
dismiss():否。
accept():是。
text():获取弹出框里的内容。
鼠标操作。定位悬浮框中的元素并操作。
由selenium的ActionChains类来完成模拟鼠标操作。
主要操作流程:
1、存储鼠标操作。
2、perform()来执行鼠标操作。
支持的操作如下:
double_click 双击操作
context_click 右键操作
drag_and_drop 拖拽操作。左键按住拖动某一个元素到另外一个区域,然后释放按键move_to_element()---鼠标悬停 。以后会经常遇到
perform()
引入ActionChains类:
from selenium.webdriver.common.action_chains import ActionChains
AC.方法名1().context_click().perform()
上一篇文章有具体的方法
操作下拉列表里的元素
观察下拉框页面元素。是否为select/option。
1、菜单栏-点击其中的某个链接跳转。
2、在下拉列表中选择一个值。
思路:
1、等待下拉列表和下拉列表中值存在
2、对下拉列表中的元素进行操作
两种方式:
一、获取所有的下拉列表值,然后用循环去匹配相同的值。
二、通过text的内容来找到下拉列表的某个值
Select类-下拉框操作
selenium提供了Select类来处理select/option
引入类:
from selenium.webdriver.support.ui import Select
选择下拉列表值:
1、通过下标选择:select_by_index(index) 从0开始;
2、通过value属性:select_by_value(value值)
3、通过文本内容:select_by_visible_text(文本内容)
页面切换操作
selenium提供了Select类来处理select/option
引入类:
from selenium.webdriver.support.ui import Select
选择下拉列表值:
1、通过下标选择:select_by_index(index) 从0开始;
2、通过value属性:select_by_value(value值)
3、通过文本内容:select_by_visible_text(文本内容)
上传操作
1.是input输入框
如果是input 可以直接输入路径的,那么直接调send_keys输入路径
1
2.不是input输入框
2、非input标签的上传,则需要借助第三方工具:
2.1 AutoIt 我们去调用其生成的au3或exe文件。
2.2 SendKeys第三方库 (目前只支持到2.7版本)
网址:https://pypi.python.org/pypi/SendKeys
2.3 Python pywin32库,识别对话框句柄,进而操作
pyautoit
工具:
pywin32和spy++
在这里插入图片描述
上传操作
#chrome
import win32gui
import win32con
dialog = win32gui.FindWindow("#32770","打开") #一级窗口
#找到窗口
ComboBoxEx32 = win32gui.FindWindowEx(dialog,0,"ComboBoxEx32",None) #二级
comboBox = win32gui.FindWindowEx(ComboBoxEx32,0,"ComboBox",None) #三级
edit = win32gui.FindWindowEx(comboBox,0,'Edit',None) #四级
button = win32gui.FindWindowEx(dialog,0,'Button',None) #四级
#操作
win32gui.SendMessage(edit,win32con.WM_SETTEXT,None,'D:\\apk.txt') #发送文件路径
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) #点击打开按钮
win32gui.FindWindow(lpClassName,lpWindowName)
自顶层窗口开始寻找匹配条件的窗口,并返回这个窗口的句柄。
lpClassName:类名,在Spy++里能够看到
lpWindowName:窗口名,标题栏上能看到的名字
win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None)
搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。找不到就返回0。
hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。
hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。
lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。
lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
win32gui.SendMessage(hWnd, Msg, wParam, lParam)
hWnd:整型,接收消息的窗体句柄
Msg:整型,要发送的消息,这些消息都是windows预先定义好的.
wParam:整型,消息的wParam参数
lParam:整型,消息的lParam参数
下载文件
处理方法:
1、跟上传类似,可以用autoit和win32api解决
2、指定下载路径,不弹出弹框,直接下载到指定路径。
富文本框操作
富文本元素的定位方法:
1:有frame 就直接切换到frame里面去进行操作
例:印象笔记web版
2:如果没有frame,就需要用到js来进行处理:
js = "document.getElementById('xxx').contentWindow.document.body.innerHTML = 'xxx'
#前面xxx是元素 后面xxx是内容,
driver.execute_script(js)
页面中有些元素的值,是通过调用js来设置的。
所以即使你在页面上输入了数据,但是你在html对应的元素的text里没有内容。
这种情况下,你需要通过js来找到这个元素,然后调用方法来设置值。
ps:对测试系统不清楚的情况下,寻求开发人员的帮助。
例:博客园里的评论区。
a = document.getElementById("tbCommentBody")
a.value (获取值和设置值)
b = document.getElementById("btn_comment_submit")
b.click()
————————————————
版权声明:本文为CSDN博主「三分归元7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kafu0/article/details/120845496