Selenium WebDrivers 学习记录 - 弹出框处理 & 窗口切换

页面弹窗

等待弹出框出现之后,定位弹出框,操作其中元素

场景案例 - 百度登录

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

# 驱动路径
chromedriver_path=r"D:\Python\chromedriver.exe"
#创建FChrome WebDriver的实例
driver = webdriver.Chrome(chromedriver_path)
driver.maximize_window()
#打开网页
driver.get("https://www.baidu.com/")
#点击登录按钮
# login=driver.find_element_by_name("tj_login")
'''方法1'''
#获取所有name值为tj_login的元素
# login=driver.find_elements_by_name("tj_login")
#通过下标定位
# login[1].click()
'''方法2'''
#获取其父标签
father_login=driver.find_element_by_id("u1")
login=father_login.find_element_by_name("tj_login")
login.click()
#判断弹窗是否弹出
status=False
try:
    #显示等待
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "TANGRAM__PSP_4__foreground")))
    status = True
except Exception as e:
    print(e)
    status = False

if status:
    #获取登录方式按钮
    us_login = driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn')
    print(us_login.is_displayed())
    #判断登录方式按钮是否可用
    if us_login.is_displayed():
        us_login.click()
    user=driver.find_element_by_id('TANGRAM__PSP_10__userName')
    user.clear()
    user.send_keys("529405384@qq.com")
    password=driver.find_element_by_id("TANGRAM__PSP_10__password")
    password.clear()
    password.send_keys("******")
    submit=driver.find_element_by_id('TANGRAM__PSP_10__submit')
    submit.submit()

Windows 弹出框

使用 driver.switch_to.alert  切换到 Windows 弹出框
Alert 类提供了一系列操作方法:

  • accept() 确定
  • dismiss() 取消
  • text() 获取弹出框里面的内容
  • send_keys(keysToSend) 输入字符串

场景案例 - 设置百度搜索每页显示条数

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select
import time

# 驱动路径
chromedriver_path=r"D:\Python\chromedriver.exe"
#创建FChrome WebDriver的实例
driver = webdriver.Chrome(chromedriver_path)
driver.maximize_window()
#打开网页
driver.get("https://www.baidu.com/")
#获取设置按钮
bd_set=driver.find_element_by_link_text("设置")
#鼠标移动到设置
mouse=ActionChains(driver)
mouse.move_to_element(bd_set).perform()
#等待元素出现
search_set=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, "搜索设置")))
#点击
search_set.click()
#修改每页显示2条数
num=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, "nr")))
time.sleep(3)
Select(num).select_by_visible_text("每页显示20条")
#保存设置
save_set=driver.find_element_by_link_text("保存设置")
save_set.click()
time.sleep(3)
#判断是否有弹窗
t = driver.switch_to.alert
#窗口文字
print(t.text)
#点击确定
t .accept()

浏览器窗口切换

  • window_handles 获取所有窗口句柄
  • switch_to.window 切换窗口
  • current_window_handle 获取当前窗口句柄

查看网易邮箱帐号服务条款

# 驱动路径
chromedriver_path=r"D:\Python\chromedriver.exe"
#创建FChrome WebDriver的实例
driver = webdriver.Chrome(chromedriver_path)
driver.maximize_window()
#打开网页
driver.get("https://reg.mail.163.com/unireg/call.do?cmd=register.entrance")
#打开协议
driver.find_element_by_partial_link_text('网易邮箱帐号服务条款').click()
#打印窗口标题
print(driver.title)
#获取所有窗口
allhandles = driver.window_handles
#切换窗口
driver.switch_to.window(allhandles[1])
#打印窗口标题
print(driver.title)

网页标题截图
Selenium WebDrivers 学习记录 - 弹出框处理 & 窗口切换
运行结果
Selenium WebDrivers 学习记录 - 弹出框处理 & 窗口切换

问题记录

模拟测试百度登录时发现,使用find_element_by_name("tj_login"),然后模拟点击时,抛出元素不可交互异常selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable,然后分析发现 DOM 中两个有登录按钮,且各属性完全一致,通过开发者模式定位到实际登录按钮位于图中第二个框,所以修改如下:

from selenium import webdriver

# 驱动路径
chromedriver_path=r"D:\Python\chromedriver.exe"
#创建FChrome WebDriver的实例
driver = webdriver.Chrome(chromedriver_path)
driver.maximize_window()
#打开网页
driver.get("https://www.baidu.com/")
#点击登录按钮
# login=driver.find_element_by_name("tj_login")
'''方法1'''
#获取所有name值为tj_login的元素
# login=driver.find_elements_by_name("tj_login")
#通过下标定位
# login[1].click()
'''方法2'''
#获取其父标签
father_login=driver.find_element_by_id("u1")
login=father_login.find_element_by_name("tj_login")
login.click()

Selenium WebDrivers 学习记录 - 弹出框处理 & 窗口切换