找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
本帖最后由 武汉18期-杨铭 于 2022-9-6 19:47 编辑

二、Python+Selenium 常用控件定位
1、定位文本框,密码框
a.先使用web元素定位方法定位文本框,密码框,再使用send keys0方法进行文本,
密码输入
driver = webdriver.Chrome()
driver.get('http://test.duoceshi.cn/cms/manage/login.do)
driver.find element _by_id ("userAccount").send keys('admin')
driver.find element by_id(loginPwd').send_keys('123456")
b. send keys0方法进行输入,输入中文需要在文本内容前面加1个u,否则会报错.
C send keys0方法可用于上传文件的操作,参数可以直接是文件的路径
2、定位普通按钮,链接,隐藏框
方法:先使用web元素定位方法定位元素,再使用click0方法进行点击。
例子:
1)点击百度一下按钮
driver.find element_by_id ('su').click()
2)点击百度新闻链接
driver.find element by link text('hao123').click()
---
from selenium import  webdriver
import time
import random
from selenium.webdriver.support.select import Select#导入select类
driver=webdriver.Chrome()#通过webdriver 调用chrome 生成浏览器对象
driver.get("file:///C:/Users/Administrator/Documents/Tencent%20Files/164885861/FileRecv/student_msg.html")#打开测试地址
time.sleep(2)#强制等待
driver.maximize_window()#窗口最大化
#为了元素定位更加准确,防止元素折叠导致元素定位不到,代码异常
time.sleep(2)
#id定位
driver.find_element_by_id("userid").send_keys("admin")#输入账号
time.sleep(2)
#name定位
driver.find_element_by_name("password").send_keys("123456")#输入密码
#单选框性别选择框
driver.find_element_by_id("girl").click()#点击女生
time.sleep(2)
driver.find_element_by_id("boy").click()#点击男生
#多选框定位
# driver.find_element_by_id("h").click()
# driver.find_element_by_id("p").click()
# driver.find_element_by_id("j").click()
#随机定位
checkbox=driver.find_elements_by_name("subject")#获取所有元素值为subject
for i in range(3):#取值次数
    inx=random.randint(0,len(checkbox)-1)#随机在列表中取值,因在删除列表长度的变化所以用到len
    box=checkbox.pop(inx)#把取出来的值删除,防止再次选中
    box.click()
    time.sleep(2)
---
#截图
path=r'D:\html\baidu.png'#定义图片的存放路径及名称
driver.get_screenshot_as_file(path)
#通过对象调用get_screenshot_as_file 把当前界面进行截图,把图片保持到自定义的路径中
---

3、鼠标移动到某个元素上
1)定位百度首页的设置按钮
2)定位下拉的高级搜索按钮,先把鼠标移动到设置按钮上,再点击高级搜索按钮
代码如下:
from selenium.webdriver.support.common.action chains import ActionChains
ActionChains(driver).move to element(元素).perform()
方法:
1) move to element() #移动鼠标到某个网页元素上
2) perform() #为鼠标移动后的确认

---
from selenium import webdriver
import time
import random
from selenium.webdriver.support.select import Select #导入select 类
from selenium.webdriver.common.action_chains import ActionChains #导入ActionChains类
driver=webdriver.Chrome() #通过webdriver调用chrome生成浏览器对象
driver.get('http://www.baidu.com')#打开测试地址
time.sleep(2)#强制等待
driver.maximize_window()#窗口最大
#悬停
a=driver.find_element_by_id('s-usersetting-top')#找到要悬停的位置
#导入ActionChains类
#在a这个位置模拟鼠标的操作
#perform() 模拟鼠标放置在某一个位置
ActionChains(driver).move_to_element(a).perform()#鼠标悬停在设置按钮上
time.sleep(2)
driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]/span').click()#点击搜索设置

---

6、获取窗口title
获取窗口title,用于断言当前窗口是否打开
方法:driver.title
例子:百度首页title获取并断言
assert drivertitle==(百度一下,你就知道:
注意点:
assert 为断言,判断获取的title是否和预期的'百度一下,你就知道;相同。
7、窗口最大化
方法:maximize window()
例子:句柄.maximize window0
---
from selenium import webdriver
import time
driver=webdriver.Chrome() #通过webdriver调用chrome生成浏览器对象
driver.get('http://www.baidu.com')#打开测试地址
time.sleep(2)
#driver.get('http://www.jd.com')
#在一个案例中不能通过get打开多个窗口,只能显示最后的窗口,前面的窗口会被后面的进行覆盖
jd='window.open("http://www.jd.com")'
driver.execute_script(jd)#如果要实现打开多个网址,需要使用window.open打开
time.sleep(2)#强制等待
driver.maximize_window()#窗口最大
#在京东输入框输入商品
#driver.find_element_by_id('key').send_keys("月饼")
# title=driver.title#获取窗口的标题
# print(title)#百度一下,你就知道

---
8、窗口刷新
方法:refresh()
例子:句柄.refresh
9、返回上-步
方法:backo
例子: driver.back()
10、获取窗口的尺寸
方法:get window_ size0
例子:句柄.get window_ size0
11、关闭当前浏览器
方法:close0
例子:句柄.close()
12、关闭所有的浏览器
方法:quito
例子:句柄.quit()
13、切换窗口
场景:在打开多个窗口时,需要定位新窗口中的元素,我们需要进行窗口切换。
方法:方法是先获取窗口句柄,再通过switch to.window0方法进行窗口切换。
handle = driver.current_window_handle #获取当前窗口的句柄
handles =driver. window_handles #获取所有窗口的句柄
driver.switch to.window(handles [tindex])#通过句柄的索引进行切换

解释:
对象handles是一个列表,列表中的元素就是一个个窗口句柄。窗口句柄是一个系
统内部数据结构的引用。通过这个句柄,我们就可以控制这个窗口,对这个窗口
进行放大,缩小,切换等操作.
---
#获取页面句柄
hade=driver.current_window_handle#获取当前的单个句柄
#print(hade)
hades=driver.window_handles#获取到已知窗口的所有句柄
#print(hades)
#通过句柄切换页面
driver.switch_to.window(hades[1])#通过switch_to 切换窗口结合句柄索引
title1=driver.title#获取窗口标题
print(title1)#京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!
time.sleep(2)
driver.find_element_by_id('key').send_keys("月饼")
---
14、获取下拉框选项
引入类:SelectQ
from selenium.webdriver.support.select import Select
实战网址:https://www.ctrip.com/
1) select by index()
#通过下标定位下拉选项
2)select by_ value( #通过value属性值定位下拉选项
3) select by_ visible_ textQ#通过下拉文本内容内容
---
#下拉选择框定位
#要导入select 类
selectbox=driver.find_element_by_id("school")#定位下拉框
time.sleep(2)
Select(selectbox).select_by_index(3)#通过索引值定位下拉选项
time.sleep(3)
Select(selectbox).select_by_value("tj")#通过value值定位下拉选择项
time.sleep(3)
Select(selectbox).select_by_visible_text("多测师广州校区")#通过可见文本定位下拉选择框
---
15、弹框处理
三种弹框的处理方法:警告型,确认型,输入型弹框

t= driver.switch to.alert( #切换进入alertQ弹框
t.text() #获取弹框的上面的文本
t.accept()   #点击确定按钮
t.dismiss0()   #点击取消按钮
send Keys()    #输入型弹框可以在弹框上面进行文本输入
16、iframe框处理
定位的元素在iframe标签里面,需要先进入irame,再进行元素定位
进入frame框方法:switch to.frame(
退出iframe框方法:switch to.default_ contento
实战案例一:https://mail.163.com/
实战案例二:用QQ登录京东网站
方法:可以通过xpath, tag_name,索引!等方法定位iframe框
注意:定位的irame里面包含iframe,我们需要使用多次switch to.frame0,从外层一层进入,退出的时候使用一次switch to.default contento就可退出到最外面一层
---
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://www.jd.com/')
driver.maximize_window()#弹窗最大化
time.sleep(2)
driver.find_element_by_link_text("你好,请登录").click()
time.sleep(2)
driver.find_element_by_class_name("QQ-icon").click()
time.sleep(2)
# # 第一种方式
# # 定位iframe框的位置
# ifr=driver.find_element_by_id("ptlogin_iframe")
# time.sleep(1)
# driver.switch_to.frame(ifr)#切换进入此框中
# time.sleep(2)
# driver.find_element_by_id('img_out_164885861').click()

#第二种方式
# driver.switch_to.frame(0)#切换进入到第一个frame框
# time.sleep(1)
# driver.find_element_by_id('img_out_2453731669').click()

#第三种方式
# driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
#time.sleep(1)
driver.find_element_by_id('img_out_164885861').click()
time.sleep(4)#加了较长的等待时间后,会自带退出iframe框,不加则需要进行切换
# driver.switch_to.default_content()#取消所有iframe框
driver.find_element_by_id("key").send_keys("月饼")
driver.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click()

---
4、selenium三种等待方式
[图片]
强制等待 time.sleep(2)   一定要等待完成规定的秒数后,方可执行后面的代码
隐式等待  driver.implicitly_wait(5)   
等待页面所有的元素加载完成,则自动进行下一步操作  
如果等待时间超过设置的时间则会报错
显式等待   
需要先导入模块  ==》
from selenium.webdriver.support.wait import WebDriverWait

显式等待详细解释:
WebDriverWait(driver,timeout, poll frequency=0.5,ignored exceptions=None)
from selenium.webdriver.support.wait import WebDriverWait
#导入模块
driver:浏览器驱动
timeout: 最长超时时间,默认以秒为单位
poll frequency : 检测的间隔步长,默认为0.5s
ignored exceptions:超时后的抛出的异常信息,默认抛出
NoSuch ElementException异常。


案例一:
from selenium import webdriver
import time
from selenium.webdriver.common.by import By #导入by类
from selenium.webdriver.support import expected_conditions as EC#通过as将关键字expected_conditions 重命名 为EC
from selenium.webdriver.support.wait import WebDriverWait#导入显示等待
driver=webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(2)#强制等待
driver.maximize_window()#弹窗最大化
driver.implicitly_wait(5)#隐式等待
e1=WebDriverWait(driver=driver,timeout=5,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,'kw'))) #显式等待
e1.send_keys('1234')

# driver:对象,浏览驱动
# timeout:最长超时时间,默认以秒为单位
# poll_frequency:检测的间隔步长值
# ignored_exceptions:超时后抛出的信息
# presence_of_element_located:查找元素值,必须以元组的形式传入


17、滚动条定位
滚动条是由js代码编写的
方法: execute_script
(代码如下: js1=window.scrollTo(O,20000)   #向下滚动20000px driver.execute_script(js1)
js2=window.scrollTo(0,0) #从底部滚动到顶部 driver.execute_script(js2)

from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get('https://www.jd.com/')
driver.maximize_window()#弹窗最大化
driver.implicitly_wait(5)#隐式等待
time.sleep(3)
js='window.scrollTo(0,1800)'#从顶端0的位置滑动到1800的位置
driver.execute_script(js)
time.sleep(3)
js1='window.scrollTo(0,0)'#返回顶端
driver.execute_script(js1)


18、 Keys类
from selenium.webdriver.common.keys import Keys
删除单个字符: Keys.BACK_SPACE
全选: Keys.CONTROL,'a'
剪切: Keys.CONTROL,'x'
粘贴: Keys.CONTROL,'v'
点击确定: Keys.ENTER
进阶:可以把相同的步骤封装在一个函数里面


from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get('https://www.jd.com/')
driver.maximize_window()#弹窗最大化
driver.implicitly_wait(5)#隐式等待
time.sleep(3)

方法一:
driver.find_element_by_id('key').send_keys('手机')
driver.implicitly_wait(5)#隐式等待
driver.find_element_by_id('key').send_keys(Keys.CONTROL,'a')#全选
driver.find_element_by_id('key').send_keys(Keys.CONTROL,'x')#剪切
time.sleep(5)
driver.find_element_by_id('key').send_keys(Keys.CONTROL,'v')#粘贴
time.sleep(2)
driver.find_element_by_id('kw').send_keys(Keys.ENTER)#回车 确认
#keys 类作用就是模拟数据键盘的快捷操作

方法二:

#封装
def ke_ys(e,kes):#定义函数
driver.find_element_by_id(e).send_keys(kes)
if __name__ == '__main__':
    ke_ys('key','电脑')#输入的值
ke_ys('key',(Keys.CONTROL,'a'))#全选
ke_ys('key', (Keys.CONTROL, 'x'))#剪切
ke_ys('key', (Keys.CONTROL, 'v'))#粘贴


分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册