Selenium爬虫笔记-肆章弹窗提示
Selenium爬虫笔记-肆章弹窗提示

Selenium爬虫笔记-肆章弹窗提示

目录

切换到新的窗口

如果我们要到新的窗口里面操作,该怎么做呢?

可以使用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框

对checkbox进行选择,也是直接用 WebElement 的 click 方法,模拟用户点击选择。 需要注意的是,要选中checkbox的一个选项,必须先获取当前该复选框的状态 ,如果该选项已经勾选了,就不能再点击,否则反而会取消选择。 我们的思路可以是这样:
  1. 先把已经选中的选项全部点击一下,确保都是未选状态
  2. 再点击要选择的对象
小江老师
小雷老师
小凯老师
				
					# 先把 已经选中的选项全部点击一下
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
<option value="foo">Bar</option>
就可以根据 foo 这个值选择该选项,
s.select_by_value('foo')

select_by_index
根据选项的 次序 (从1开始),选择元素
​s.select_by_index(1)

select_by_visible_text
根据选项的 可见文本 ,选择元素。
<option value="foo">Bar</option>
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)
				
			

3条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注