一、多窗口处理
    在我们做webUI自动化的过程中,经常会遇到点击某个页面元素后会在当前浏览器中新打开一个窗口,我们需要定位的后续元素就在新打开的浏览器窗口中,通过常规定位方式,selenium是无法定位到最新窗口页面中的元素的例如:
    image.png
    此时我们的处理方式是:
    1、通过driver.window_handles先获取浏览器打开的所有窗口的句柄;
    2、通过driver.switch_to.window(handles[-1])切换到最新打开的窗口再进行相关元素的定位及操作;

    1. from selenium import webdriver
    2. import time
    3. from selenium.webdriver.common.by import By
    4. from selenium.webdriver.support.wait import WebDriverWait
    5. from selenium.webdriver.support import expected_conditions as EC
    6. driver = webdriver.Chrome()
    7. try:
    8. driver.get(url='https://www.baidu.com/')
    9. driver.maximize_window()
    10. driver.implicitly_wait(5)
    11. WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.XPATH, "//*[@href='http://news.baidu.com']"))).click()
    12. handles = driver.window_handles #获取当前浏览器的所有窗口句柄返回一个列表
    13. print(handles)
    14. driver.switch_to.window(handles[-1]) #切换到最新打开的窗口
    15. WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.LINK_TEXT, "国内"))).click()
    16. time.sleep(5)
    17. except Exception as e:
    18. raise e
    19. finally:
    20. driver.quit()

    switch_to.window()方法的使用:

    1. handles = driver.window_handles #获取当前浏览器的所有窗口句柄
    2. driver.switch_to.window(handles[-1]) #切换到最新打开的窗口
    3. driver.switch_to.window(handles[-2]) #切换到倒数第二个打开的窗口
    4. driver.switch_to.window(handles[0]) #切换到最开始打开的窗口
    5. driver.current_window_handle #获取当前页的句柄

    二、页面弹框处理
    对于页面弹框,如对话、警告等弹框,如果不进行处理,将阻断后续页面元素定位,对于弹框我们通过driver.switch_to.alert来定位弹框;
    弹框分类:
    1、一个按钮 弹框;
    2、两个按钮 弹框;
    3、两个按钮+输入框 弹框;
    下面为这三种弹框的html练习代码:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    5. <title></title>
    6. </head>
    7. <body>
    8. 三种弹出框alert(一个按钮),confirm(两个按钮),prompt(两个按钮+输入框)
    9. <div align="center">
    10. <h4>三种弹框</h4>
    11. <input type="button" id="in_one" onclick="showPro()" value="输入框弹窗按钮"/>
    12. <input type="button" id="in_two" onclick="showAlert2()" value="提示弹窗按钮"/>
    13. <input type="button" id="in_three" onclick="showAlert()" value="确认弹窗按钮"/><br><br><br>
    14. <span id="textSpan"></span>
    15. </div>
    16. </body>
    17. <script>
    18. function showAlert(){
    19. document.getElementById("textSpan").innerHTML="";
    20. if(confirm("知识及时总结复习了吗?")){
    21. document.getElementById("textSpan").innerHTML="<font style='color: red;'>加油,奥里给!</font>";
    22. }else{
    23. document.getElementById("textSpan").innerHTML="<font style='color: red;'>不要偷懒,学习要自觉!</font>";
    24. }
    25. }
    26. function showPro(){
    27. document.getElementById("textSpan").innerHTML="";
    28. con = prompt("输入1为好好学习,输入2为多多练习");
    29. if(con==1){
    30. document.getElementById("textSpan").innerHTML="<font style='color: green;'>好好学习,注重知识积累</font>";
    31. }else if(con==2){
    32. document.getElementById("textSpan").innerHTML="<font style='color: green;'>多多练习,做到熟能生巧</font>";
    33. }else{
    34. document.getElementById("textSpan").innerHTML="<font style='color: red;'>有探索精神是好,但年轻人首先要讲规矩,请重新输入吧</font>";
    35. }
    36. }
    37. function showAlert2(){
    38. document.getElementById("textSpan").innerHTML="";
    39. alert("有些路当时没走好,总有一天回过头还要重新来过");
    40. }
    41. </script>
    42. </html>

    输入框弹窗
    image.png
    提示弹窗
    image.png
    确认弹窗
    image.png
    弹窗处理方法:
    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常用方法:

    1. driver.switch_to.alert.text #获取弹窗文本提示
    2. driver.switch_to.alert.send_keys("字符串") # 对弹框输入框输入字符
    3. driver.switch_to.alert.accept() # 对弹框进行确定
    4. driver.switch_to.alert.dismiss() # 对弹框进行取消
    1. from selenium import webdriver
    2. import time
    3. from selenium.webdriver.common.by import By
    4. driver = webdriver.Chrome()
    5. try:
    6. driver.get(url='http://localhost:63342/test_jcmall_teach/alter_page.html?_ijt=nvons4lg2j83g4609lta1ijto7')
    7. driver.maximize_window()
    8. driver.implicitly_wait(5)
    9. time.sleep(5)
    10. driver.find_element(By.ID, 'in_one').click()
    11. time.sleep(3)
    12. ele_1 = driver.switch_to.alert
    13. print(ele_1.text)
    14. ele_1.send_keys('1')
    15. ele_1.accept()
    16. time.sleep(5)
    17. driver.find_element(By.ID, 'in_two').click()
    18. time.sleep(3)
    19. ele_2 = driver.switch_to.alert
    20. print(ele_2.text)
    21. ele_2.accept()
    22. time.sleep(5)
    23. driver.find_element(By.ID, 'in_three').click()
    24. time.sleep(3)
    25. ele_3 = driver.switch_to.alert
    26. print(ele_3.text)
    27. ele_3.accept()
    28. time.sleep(5)
    29. driver.find_element(By.ID, 'in_three').click()
    30. time.sleep(3)
    31. ele_4 = driver.switch_to.alert
    32. ele_4.dismiss()
    33. time.sleep(5)
    34. except Exception as e:
    35. raise e
    36. finally:
    37. driver.quit()