目录
切换到新的窗口
如果我们要到新的窗口里面操作,该怎么做呢?
可以使用Webdriver对象的switch_to属性的 window方法,如下所示:
- wd.switch_to.window(handle)
其中,参数handle需要传入什么呢?WebDriver对象有window_handles 属性,这是一个列表对象, 里面包括了当前浏览器里面所有的窗口句柄。所谓句柄,大家可以想象成对应网页窗口的一个ID,那么我们就可以通过 类似下面的代码
from selenium import webdriver
wd = webdriver.Chrome()
wd.get("https://www.baidu.com/")
wd.implicitly_wait(2)
# 打开一个新窗口
wd.execute_script("window.open('https://douban.com/')")
# 原窗口[0], 转到转到新窗口[1]
wd.switch_to.window(wd.window_handles[1])
print(driver.page_source)
for handle in wd.window_handles:
# 先切换到该窗口
wd.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if 'Bing' in wd.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
wd.implicitly_wait(10)#最大10秒
wd.get('https://cdn2.byhy.net/files/selenium/sample3.html')
# mainWindow变量保存当前窗口的句柄
mainWindow = wd.current_window_handle
wd.find_element(By.CSS_SELECTOR,'[href="http://www.bing.com"]').click()
for handle in wd.window_handles:
# 先切换到该窗口
wd.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '必应' in wd.title:
print(handle)
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break
#在Bing.com输入框输入hello
wd.find_element(By.CSS_SELECTOR,'#sb_form_q').send_keys('hello')
# 回到原页面
#通过前面保存的老窗口的句柄,自己切换到老窗口
wd.switch_to.window(mainWindow)
wd.find_element(By.CSS_SELECTOR,'#outerbutton').click()
# wd.quit()
选择框
radio框
radio框选择选项,直接用WebElement的click方法,模拟用户点击就可以了。但是无法获取点击后的值,只能获取默认值。
小雷老师
小凯老师
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
wd.implicitly_wait(10)#最大10秒
wd.get('https://cdn2.byhy.net/files/selenium/test2.html')
element=wd.find_element(By.CSS_SELECTOR,'#s_radio input[checked="checked"]')
print('当前为:'+element.get_attribute('value'))
wd.find_element(By.CSS_SELECTOR,'#s_radio [value="小江老师"]').click()
element=wd.find_element(By.CSS_SELECTOR,'#s_radio"]')
print('当前为:'+element.get_attribute('value'))
# wd.quit()
checkbox框
- 先把已经选中的选项全部点击一下,确保都是未选状态
- 再点击要选择的对象
小雷老师
小凯老师
# 先把 已经选中的选项全部点击一下
elements = wd.find_elements(By.CSS_SELECTOR,
'#s_checkbox input[checked="checked"]')
for element in elements:
element.click()
# 再点击 小雷老师
wd.find_element(By.CSS_SELECTOR,
"#s_checkbox input[value='小雷老师']").click()
select框
select框是一个新的select标签
对于Select 选择框,Selenium 专门提供了一个 Select类 进行操作。
<select id=”ss_single”>
<option value=”小江老师”>小江老师</option>
<option value=”小雷老师”>小雷老师</option>
<option value=”小凯老师” selected=”selected”>小凯老师</option>
</select>
基本select方法
select_by_value
就可以根据 foo 这个值选择该选项,
s.select_by_value('foo')
select_by_index
根据选项的 次序 (从1开始),选择元素
s.select_by_index(1)
select_by_visible_text
根据选项的 可见文本 ,选择元素。
s.select_by_visible_text('Bar')
deselect_by_value 根据选项的value属性值, 去除 选中元素
deselect_by_index 根据选项的次序,去除 选中元素
deselect_by_visible_text 根据选项的可见文本,去除 选中元素
deselect_all 去除 选中所有元素
Select单选框
# 导入Select类
from selenium.webdriver.support.ui import Select
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
wd.get('https://cdn2.byhy.net/files/selenium/test2.html')
wd.implicitly_wait(5)
# 创建Select对象 select对象的ID=ss_single
select = Select(wd.find_element(By.ID, "ss_single"))
# 通过 Select 对象选中小雷老师
select.select_by_visible_text("小雷老师")
# 或
select.select_by_value("小雷老师")
Select多选框
对于select多选框,要选中某几个选项,要注意去掉原来已经选中的选项。
可以用select类 的deselect_all方法,清除所有 已经选中 的选项。
然后再通过 select_by_visible_text方法 选择 小雷老师 和 小凯老师。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
wd.get('https://cdn2.byhy.net/files/selenium/test2.html')
wd.implicitly_wait(5)
# 创建Select对象
select = Select(wd.find_element(By.ID, "ss_multi"))
# 清除所有 已经选中 的选项
select.deselect_all()
# 选择小雷老师 和 小凯老师
select.select_by_visible_text("小雷老师")
select.select_by_visible_text("小凯老师")
实战技巧 ActionChains
之前我们对web元素做的操作主要是:选择元素,然后 点击元素 或者 输入 字符串。
其他的操作比如: 鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等。
这些操作,可以通过 Selenium 提供的 ActionChains 类来实现。
ActionChains 类 里面提供了 一些特殊的动作的模拟,我们可以通过 ActionChains 类的代码查看到,如下所示
# 导入ActionChains类
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
driver.implicitly_wait(5)
driver.get('https://www.baidu.com/')
ac = ActionChains(driver)
# 鼠标移动到 元素上
ac.move_to_element(
driver.find_element(By.CSS_SELECTOR, '[name="tj_briicon"]')
).perform()
冻结界面
在 开发者工具栏 console 里面执行如下js代码
- setTimeout(function(){debugger}, 5000)
表示在 5000毫秒后,执行 debugger 命令
执行该命令会 浏览器会进入debug状态。 debug状态有个特性, 界面被冻住, 不管我们怎么点击界面都不会触发事件。
所以,我们可以在输入上面代码并回车 执行后, 立即 鼠标放在界面 右上角 更多产品处。
这时候,就会弹出 下面的 糯米、音乐、图片 等图标。
然后,我们仔细等待 5秒 到了以后, 界面就会因为执行了 debugger 命令而被冻住。
然后,我们就可以点击 开发者工具栏的 查看箭头, 再去 点击 糯米图标 ,查看其属性了。
弹出对话框
Alert
Alert 弹出框,目的就是显示通知信息,只需用户看完信息后,点击 OK(确定) 就可以了。
selenium提供如下方法进行操作:
- driver.switch_to.alert.accept()
如果程序要获取弹出对话框中的信息内容, 可以通过 如下代码
- driver.switch_to.alert.text
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
driver.implicitly_wait(5)
driver.get('https://cdn2.byhy.net/files/selenium/test4.html')
# --- alert ---
driver.find_element(By.ID, 'b1').click()
# 打印 弹出框 提示信息
print(driver.switch_to.alert.text)
# 点击 OK 按钮
driver.switch_to.alert.accept()
Confirm
如果我们想点击 Cancel 按钮, 可以用 dismiss方法,如下
- driver.switch_to.alert.dismiss()
Prompt
出现 Prompt 弹出框 是需要用户输入一些信息,提交上去。
比如:当管理员在网站上选择给某个账号延期时,就可能会弹出 Prompt 弹出框, 要求输入延期多长时间。可以调用如下方法:
- driver.switch_to.alert.send_keys()
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
driver.implicitly_wait(5)
driver.get('https://cdn2.byhy.net/files/selenium/test4.html')
# --- prompt ---
driver.find_element(By.ID, 'b3').click()
# 获取 alert 对象
alert = driver.switch_to.alert
# 打印 弹出框 提示信息
print(alert.text)
# 输入信息,并且点击 OK 按钮 提交
alert.send_keys('oldkingooo')
alert.accept()
其他技巧
获取窗口大小
- driver.get_window_size()
改变窗口大小
- driver.set_window_size(x, y)
获取当前窗口标题
- driver.title
获取当前窗口URL地址
- driver.current_url
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
driver.implicitly_wait(5)
driver.get('https://www.163.com')
# 获取网站标题栏文本
print(driver.title)
# 获取网站地址栏文本
print(driver.current_url)
# 截屏保存为图片文件,同代码文件夹
driver.get_screenshot_as_file('1.png')
手机模式(报错)
from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" }
# chrome_options = webdriver.ChromeOptions()
chrome_options = webdriver.Chrome(service=Service(r'D:\Software\chromedriver_win32\chromedriver.exe'))
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())
driver.get('http://www.baidu.com')
input()
driver.quit()
上传文件
有时候,网站操作需要上传文件。比如,著名的在线图片压缩网站: https://tinypng.com/ 通常,网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的。如下所示:
‘<’input multiple=”multiple” type=”file” />
使用selenium自动化上传文件,我们只需要定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可。如下所示:
先定位到上传文件的 input 元素
- ele = wd.find_element(By.CSS_SELECTOR, ‘input[type=file]’)
再调用 WebElement 对象的 send_keys 方法
- ele.send_keys(r’h:\g02.png’)
如果需要上传多个文件,可以多次调用send_keys,如下
- ele = wd.find_element(By.CSS_SELECTOR, ‘input[type=file]’)
- ele.send_keys(r’h:\g01.png’)
- ele.send_keys(r’h:\g02.png’)
但是,有的网页上传,是没有 file 类型 的 input 元素的。如果是Windows上的自动化,可以采用 Windows 平台专用的方法:执行
- pip install pypiwin32
确保 pywin32 已经安装,然后参考如下示例代码
# 找到点击上传的元素,点击
driver.find_element(By.CSS_SELECTOR, '.dropzone').click()
sleep(2) # 等待上传选择文件对话框打开
# 直接发送键盘消息给 当前应用程序,
# 前提是浏览器必须是当前应用
import win32com.client
shell = win32com.client.Dispatch("WScript.Shell")
# 输入文件路径,最后的'\n',表示回车确定,也可能时 '\r' 或者 '\r\n'
shell.Sendkeys(r"h:\a2.png" + '\n')
sleep(1)
My brother suggested I may like this blog. He was once totally right. Cody Prentice
I used too be able to find good info from your content. Leslie Alley Dugas
I am regular visitor, how are you everybody? This paragraph posted at this web site is truly fastidious. Walter Beinlich