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)
网页标题截图
运行结果
问题记录
模拟测试百度登录时发现,使用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,赞。
厉害啊,学习了
前排学习
优秀,发专辑的节奏啊,加油继续😄