6.selenium实际用法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值