selenium switch_to处理弹框和多窗口

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

St_rive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值