selenium switch_to处理弹框和多窗口
一、多窗口处理
在我们做webUI自动化的过程中,经常会遇到点击某个页面元素后会在当前浏览器中新打开一个窗口,我们需要定位的后续元素就在新打开的浏览器窗口中,通过常规定位方式,selenium是无法定位到最新窗口页面中的元素的例如:

此时我们的处理方式是:
1、通过driver.window_handles先获取浏览器打开的所有窗口的句柄;
2、通过driver.switch_to.window(handles[-1])切换到最新打开的窗口再进行相关元素的定位及操作;
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
try:
driver.get(url='<https://www.baidu.com/>')
driver.maximize_window()
driver.implicitly_wait(5)
WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.XPATH, "//*[@href='<http://news.baidu.com>']"))).click()
handles = driver.window_handles #获取当前浏览器的所有窗口句柄返回一个列表
print(handles)
driver.switch_to.window(handles[-1]) #切换到最新打开的窗口
WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.LINK_TEXT, "国内"))).click()
time.sleep(5)
except Exception as e:
raise e
finally:
driver.quit()
switch_to.window()方法的使用:
handles = driver.window_handles #获取当前浏览器的所有窗口句柄
driver.switch_to.window(handles[-1]) #切换到最新打开的窗口
driver.switch_to.window(handles[-2]) #切换到倒数第二个打开的窗口
driver.switch_to.window(handles[0]) #切换到最开始打开的窗口
driver.current_window_handle #获取当前页的句柄
二、页面弹框处理
对于页面弹框,如对话、警告等弹框,如果不进行处理,将阻断后续页面元素定位,对于弹框我们通过driver.switch_to.alert来定位弹框;
弹框分类:
1、一个按钮 弹框;
2、两个按钮 弹框;
3、两个按钮+输入框 弹框;
下面为这三种弹框的html练习代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
三种弹出框alert(一个按钮),confirm(两个按钮),prompt(两个按钮+输入框)
<div align="center">
<h4>三种弹框</h4>
<input type="button" id="in_one" onclick="showPro()" value="输入框弹窗按钮"/>
<input type="button" id="in_two" onclick="showAlert2()" value="提示弹窗按钮"/>
<input type="button" id="in_three" onclick="showAlert()" value="确认弹窗按钮"/><br><br><br>
<span id="textSpan"></span>
</div>
</body>
<script>
function showAlert(){
document.getElementById("textSpan").innerHTML="";
if(confirm("知识及时总结复习了吗?")){
document.getElementById("textSpan").innerHTML="<font style='color: red;'>加油,奥里给!</font>";
}else{
document.getElementById("textSpan").innerHTML="<font style='color: red;'>不要偷懒,学习要自觉!</font>";
}
}
function showPro(){
document.getElementById("textSpan").innerHTML="";
con = prompt("输入1为好好学习,输入2为多多练习");
if(con==1){
document.getElementById("textSpan").innerHTML="<font style='color: green;'>好好学习,注重知识积累</font>";
}else if(con==2){
document.getElementById("textSpan").innerHTML="<font style='color: green;'>多多练习,做到熟能生巧</font>";
}else{
document.getElementById("textSpan").innerHTML="<font style='color: red;'>有探索精神是好,但年轻人首先要讲规矩,请重新输入吧</font>";
}
}
function showAlert2(){
document.getElementById("textSpan").innerHTML="";
alert("有些路当时没走好,总有一天回过头还要重新来过");
}
</script>
</html>
输入框弹窗

提示弹窗

确认弹窗

弹窗处理方法:
1、首先触发弹窗;
2、通过ele = driver.switch_to.alert来获取弹窗对象;
3、如果是输入弹窗,ele.send_keys('字符串')来实现对输入框输入字符串;
4、通过ele.accept()实现【确定】/通过ele.dismiss()实现【取消】
5、如果非输入弹窗,直接通过ele = driver.switch_to.alert来获取弹窗对象,再通过ele.accept()实现【确定】/通过ele.dismiss()实现【取消】;
6、可通过ele.text获取弹窗的提示文本信息
driver.switch_to.alert常用方法:
driver.switch_to.alert.text #获取弹窗文本提示
driver.switch_to.alert.send_keys("字符串") # 对弹框输入框输入字符
driver.switch_to.alert.accept() # 对弹框进行确定
driver.switch_to.alert.dismiss() # 对弹框进行取消
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
try:
driver.get(url='<http://localhost:63342/test_jcmall_teach/alter_page.html?_ijt=nvons4lg2j83g4609lta1ijto7>')
driver.maximize_window()
driver.implicitly_wait(5)
time.sleep(5)
driver.find_element(By.ID, 'in_one').click()
time.sleep(3)
ele_1 = driver.switch_to.alert
print(ele_1.text)
ele_1.send_keys('1')
ele_1.accept()
time.sleep(5)
driver.find_element(By.ID, 'in_two').click()
time.sleep(3)
ele_2 = driver.switch_to.alert
print(ele_2.text)
ele_2.accept()
time.sleep(5)
driver.find_element(By.ID, 'in_three').click()
time.sleep(3)
ele_3 = driver.switch_to.alert
print(ele_3.text)
ele_3.accept()
time.sleep(5)
driver.find_element(By.ID, 'in_three').click()
time.sleep(3)
ele_4 = driver.switch_to.alert
ele_4.dismiss()
time.sleep(5)
except Exception as e:
raise e
finally:
driver.quit()
三、web页面中frame的处理
frame是html中的框架,在html中通过iframe可以在同一个浏览器中显示多个页面
在通过selenium做webUI自动化时,如果要定位的页面元素在iframe中,则需要切换frame再定位,否则代码会找不到页面元素;
切换frame语法:
driver.switch_to.frame(“frame id”)
#frame无ID的时候依据索引来处理,索引从0开始,例如:driver.switch_to.frame(0)
driver.switch_to.frame(“frame-index”)
driver.switch_to.frame(driver.find_elements(By.XPATH, "//*[@frameborder='0']")[1])
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
url = '<https://deyunce:219123@mall.deyunce.com/admin/account/login.html>'
driver.get(url=url)
driver.maximize_window()
driver.implicitly_wait(10)
try:
ele_account = driver.find_element(By.XPATH,"//*[@placeholder='请输入账号']")
ele_account.send_keys('dycadmin')
ele_pwd = driver.find_element(By.XPATH, "//*[@placeholder='请输入密码']")
ele_pwd.send_keys('123456')
sleep(3)
ele_login = driver.find_element(By.XPATH, "//*[text()='登录']")
ele_login.click()
sleep(3)
ele_order = driver.find_element(By.XPATH, "//*[text()='订单']")
ele_order.click()
sleep(5)
#driver.switch_to.frame(driver.find_elements(By.XPATH, "//*[@frameborder='0']")[1])
driver.switch_to.frame(1) # 此处切换到第二个frame,后再进行定位
sleep(2)
ele_search_input = driver.find_element(By.XPATH, "//*[@placeholder='请输入搜索内容']")
ele_search_input.send_keys('123456')
except Exception as e:
print(e)
finally:
sleep(3)
driver.quit()

7985

被折叠的 条评论
为什么被折叠?



