from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://sahitest.com/demo/selectTest.htm')
se = Select(driver.find_element('id', 's1Id')) # 定位下拉列表元素
# 根据索引选择 0-表示第一列
se.select_by_index(1) # 结果:选中o1
# 根据值来选择 前端页面value="o2"
se.select_by_value('o2') # 结果:选中o2
#根据文本选择,下拉列表显示的文字
se.select_by_visible_text('o3') # 结果:选中o3
#循环打印下拉框选项 options 所有选项
for options in se.options:
print(options.text)
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://sahitest.com/demo/selectTest.htm')
# 选择连续的几列
se = Select(driver.find_element('id', 's4Id')) # 定位下拉列表元素
for i in range(2, 6):
se.select_by_index(i) # 显示o2到最后一个
# 选择不连续的几列,结合ctrl键
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys # 使用键盘
element1 = driver.find_element('xpath', '//*[@id="s4Id"]/option[3]') # 定位o2
element2 = driver.find_element('xpath', '//*[@id="s4Id"]/option[5]') # 定位最后一个
ActionChains(driver).key_down(Keys.CONTROL).click(element1).key_up(Keys.CONTROL).perform() # 选中o2
ActionChains(driver).key_down(Keys.CONTROL).click(element2).key_up(Keys.CONTROL).perform() # 选中最后一个
(1)前端效果是这样的,点击输入框,出现下列列表,选择其中一个
定位输入框,点击,激活下列列表
定位下列列表的列,注意这里使用Google自带的复制xpath,可能定位不准,需要自己手动去定位列的xpath
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('')
driver.find_element('xpath', '//*[@id="userLayout"]/div/div[2]/div/div/form/div[1]/div/div/span/div').click() # 点击输入框,激活下列列表
driver.find_element('xpath', '//div[@id="popContainer"]/div[2]/div/div/div/ul/li[38]').click() # 点击列表的第38列
(2)这种多级下拉列表的与上方雷同。第一级定位点击,激活下一级,第二级定位点击,激活下一级,第三级定位点击。
#定位输入框,点击,激活下拉列表
driver.find_element('xpath', '//*[@id="popContainer"]/div[1]/div/section/section/main/div/div[2]/div/div/div/div[1]/div/div[2]/form/div/div[1]/div/div[2]/div/span/span').click()
#第一级定位点击,激活下一级下拉列表
driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul/li[3]').click()
# 第二级定位点击,激活下一级下拉列表
driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul[2]/li[1]').click()
# 第三级定位点击
driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul[3]/li[1]').click()
前端代码
driver.find_element('xpath', '//input[@type="file"]).send_keys('C:\pig\counting-video\5.mp4') # z直接输入文件绝对路径
多文件上传就是在文件路径框里用引号括起单个路径,然后用逗号隔开多个路径
前端:点击-》选择图片或视频上传
安装下面两个包
pip install -i https://pypi.douban.com/simple pywin32
pip install pyperclip
实现文件上传的方法
# filePath: 要上传的文件地址,绝对路径。
def Upload_File(filePath):
# 将文件路径放入剪切板
pyperclip.copy(filePath)
time.sleep(2)
# 发送Ctrl(17)+V(86)按钮
win32api.keybd_event(17, 0, 0, 0)
win32api.keybd_event(86, 0, 0, 0)
# 松开按键
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
# 输入回车键(13),第一次确认路径,第二次提交路径
win32api.keybd_event(13, 0, 0, 0)
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 松开按键
win32api.keybd_event(13, 0, 0, 0)
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 松开按键
time.sleep(2)
实现上传
# 首先定位“请选择视频或图片”,并点击
driver.find_element('xpath', '//*[@id="popContainer"]//div[3]').click()
Upload_File(r'D:\testdata\5.mp4') # 注意绝对路径,前面加r,否则\t会被识别为转义字符
from selenium.webdriver import ActionChains # 鼠标操作的类
from selenium.webdriver.common import keys #键盘操作的类
按住ctrl+点击ActionChains,可查看里面有很多方法
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com/')
item = driver.find_element('id', 's-usersetting-top')
ActionChains(driver).move_to_element(item).perform() # 模拟鼠标的移动操作
driver.find_element('link text', '高级搜索').click()
ActionChains(driver).double_click(item).perform() # 双击
ActionChains(driver).click(item).perform() # 单击
ActionChains(driver).context_click(item).perform() # 右键
from selenium.webdriver.common.Keys import keys
def test_key(self):
self.driver.get('htpp://www.baidu.com')
kw = self.driver.find_element_by_id('kw')
kw.send_keys('selenium')
kw.send_keys(Keys.CONTROL, 'a') # 全选
kw.send_keys(Keys.CONTROL, 'c') # 复制
kw.send_keys(Keys.CONTROL, 'x') # 剪切
kw.send_keys(Keys.CONTROL, 'v') # 粘贴
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.baidu.com/') # 默认百度窗口
current_window = driver.current_window_handle # 保存当前窗口的句柄
driver.find_element('link text', '贴吧').click() # 进入贴吧窗口
print(len(driver.window_handles)) # 窗口数量,打开了两个窗口
driver.switch_to.window(driver.window_handles[1]) # 切换到贴吧窗口
driver.find_element('id', 'wd1').send_keys('上海') # 在贴吧窗口输入框输入
driver.switch_to.window(current_window) # 切回默认百度窗口
driver.find_element('id', 'kw').send_keys('python')
在web应用中经常会出现frame的嵌套应用,假设页面上有A,B两个frame,B在A内,具体思路:
使用switch_to.frame()方法,把当前定位的主体切换到B frame里
使用switch_to.default_content()从B frame切换回A frame
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('')
# 切换到iframe内部的上下文环境中
driver.switch_to.frame(driver.find_element('name', 'iframe1'))
driver.find_element('id', 'kw').send_keys('python')
# 将上下文环境从iframe中切出来
driver.switch_to.default_content()
driver.find_element('link text', '去淘宝').click()
driver.execute_script("window.scrollTo(xpos, ypos);") # 可以控制页面上下滚动,左右滚动
# xpos 表示x坐标
# ypos 表示y坐标
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 表示滑到最低部
前端语句用checkbox类型
swimming:"checkbox" name="swimming" value="swimming">
reading:"checkbox" name="reading" value="reading">
from selenium import webdriver
import os
from time import sleep
class TestCase(object):
def __init__(self):
"""
获取当前路径下的html文件地址
"""
self.driver = webdriver.Chrome()
path = os.path.dirname(os.path.abspath(__file__)) # 获取当前项目路径
file_path = 'file:///'+path+ '/test.html'
self.driver.get(file_path)
def test_checkbox(self):
swimming = self.driver.find_element_by_name('swimming')
reading = self.driver.find_element_by_name('reading')
if not swimming.is_selected: # 如果没被选中,则点击选中
swimming.click()
if not reading.is_selected:
reading.click()
前端语句用radio类型
gender:"radio" name="gender" value="male">
"radio" name="gender" value="female">
def test_radio(self):
lst = self.driver.find_elements_by_name('gender') # 前端有多个name为gender的,用elements取出就是个列表
lst[0].click()
页面上的弹框有三种:
alert–用来提示
confirm–用来确认
prompt–输入内容
方法 /属性 | 方法/属性描述 |
---|---|
accept | 接受 |
dismiss() | 取消 |
text | 显示的文本 |
send_keys | 输入内容 |
前端在保存时会弹出提示,删除时要确认,撤销时要输入原因
<a href="javascript:alert('XXX已成功)" id="alert">保存</a>
<a href="javascript:confirm('确定要删除数据吗?)" id="confirm">删除</a>
<a href="javascript:var why=prompt('请输入原因');document.write(why)" id="prompt">撤销</a>
def test_alert(self):
self.driver.find_element_by_id('alert').click()
alert = self.driver.switch_to.alert
print(alert.text)
sleep(3)
alert.accept()
def test_confirm(self):
self.driver.find_element_by_id('confirm').click()
confirm = self.driver.switch_to.alert
print(confirm.text)
confirm.accept() # 确认
confirm.dismiss() # 取消
def test_prompt(self):
self.driver.find_element_by_id('prompt').click()
sleep(2)
prompt = self.driver.switch_to.alert
prompt.accept()
webDriver有两个方法来执行JavaScript:
execute_script 同步执行
execute_async_script 异步执行
from selenium import webdriver
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
def test1(self):
self.driver.execute_script("alert('test')") # 执行弹窗
self.driver.switch_to.alert.accept() # 弹窗点击确定
def test2(self):
js = 'return document.title' # js语句获取网页标题
title = self.driver.execute_script(js) # 执行js语句
print(title)
def test3(self):
js = 'var q = document.getElementById("kw"); q.style.border="2px solid red"' # js语句定位搜索框,将搜索框变成红色
self.driver.execute_script(js)
def test4(self):
self.driver.find_element_by_id('kw').send_keys('selenium')
self.driver.find_element_by_id('su').click()
js = 'window.scrollTo(0,document.body.scrollHeigh)' # 滑到底部
self.driver.execute_script(js)