web自动化之-- 解决:点击链接无法跳转到新页面问题)

484 阅读2分钟

背景:登录平安知鸟,点击“学员登录”链接,以新窗口打开知鸟平台登录页面并进行登录。

问题:结果出现无法正常打开新窗口,故以此篇记录问题解决思路

image.png

需要以新窗口打开如下页面: image.png

问题解决方法:

当涉及到切换窗口时,需要用到句柄,因为当前窗口的句柄和新增窗口句柄不一样,当页面进入新窗口,句柄也需相应切换

首先:打开url后需要获取当前主页面句柄,

hand_main = driver.current_window_handle 
print("主页面句柄:hand_main =" + hand_main)

然后:进入新窗口的操作后,需要获取所有窗口句柄。

# 点击链接后,获取所有窗口句柄
windows = driver.window_handles

最后:切换句柄

-------------切换句柄的两种方式-------------------
# 【切换窗口方法1】:通过句柄数组下标切换窗口 
print("总窗口数:" + str(len(windows))) 
print("点击链接后所有窗口句柄的数组:" + str(windows)) 
driver.switch_to.window(windows[1]) 
print("切换至数组下标为[1]的句柄窗口成功!") 

# 【切换窗口方法2】:循环页面句柄,获取非主页的句柄,只适用于2个页面窗口的情况 
# for handle in windows: 
#     if handle != hand_main: 
#         driver.switch_to.window(handle) 
#         print("切换句柄成功")
-------------切换句柄的两种方式-------------------

如下为web自动化测试用例脚本: 以unittest框架实现该测试用例

import unittest
from time import sleep

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

class TestLogin(unittest.TestCase):

def test_01_zhiniao_login(self):
    num = "******"
    pwd = "******"
    driver = webdriver.Chrome()
    driver.implicitly_wait(5)
    url = "https://www.zhi-niao.com/"
    driver.maximize_window()
    driver.get(url)
    # 获取主页面句柄
    hand_main = driver.current_window_handle
    print("主页面句柄:hand_main =" + hand_main)
    # 相对路径+文本定位元素
    href = driver.find_element(By.XPATH, "//span[text()='学员登录']").get_attribute("href")
    driver.find_element(By.XPATH, "//span[text()='学员登录']").click()
    # 点击链接后,获取所有窗口句柄
    windows = driver.window_handles

    '''-------------切换句柄的两种方式-------------------'''
    # 【切换窗口方法1】:通过句柄数组下标切换窗口
    print("总窗口数:" + str(len(windows)))
    print("点击链接后所有窗口句柄的数组:" + str(windows))
    driver.switch_to.window(windows[1])
    print("切换至数组下标为[1]的句柄窗口成功!")

    # 【切换窗口方法2】:循环页面句柄,获取非主页的句柄,只适用于2个页面窗口的情况
    # for handle in windows:
    #     if handle != hand_main:
    #         driver.switch_to.window(handle)
    #         print("切换句柄成功")
    '''-------------切换句柄的两种方式-------------------'''
    
    driver.find_element(By.XPATH, "//input[@placeholder='请输入手机号']").send_keys(num)
    driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']").send_keys(pwd)
    driver.find_element(By.XPATH,
                        "//span[@class='MuiButtonBase-root MuiIconButton-root jss247 MuiCheckbox-root MuiCheckbox-colorPrimary MuiIconButton-colorPrimary']").click()
    driver.find_element(By.XPATH, "//span[text()='登 录']").click()
    sleep(3)
    driver.find_element(By.XPATH, "//div[@class='geetest_slider_button']").click()
    # 进入新页面,查看当前页面句柄
    hand_two = driver.current_window_handle
    print("新页面句柄:hand_two = " + hand_two + "\n" + "杨小二test")

运行: 该用例写在一个unittest定义的方法中,想运行该一个方法,可将鼠标定位到该方法中,右键运行即可

程序运行结果: 打印出2个不同的句柄 image.png