前两天在自动化测试学习中遇到了一个问题,从当前页面点击链接到新窗口,然后判断新窗口的h1中的标题跟链接文字是否匹配的测试。

在这个过程中需要解决得问题有:

1、遍历当前页的所有文字链接

2、定位第二个窗口的元素进行断言匹配

这里以小米社区为例(http://bbs.xiaomi.cn/),来说明解决方法

1.首先获取所有的文字链接放到list列表中,通过点击(click方法)打开第二个窗口

2.通过循环语句来进行遍历,并且断言

在遍历过程中我就遇到了一个新窗口的问题打开第二个窗口后,一直定位不到第二个窗口内的元素,后来发现了问题,是我没有定位到该窗口,所以定位第二个窗口的元素肯定定位不到,所以需要用一个switch_to_window(handle名称)方法来定位到该窗口,但是定位到改窗口后,由于与需要for循环遍历,当时我没有想到关闭这个新打开的窗口,用for循环的时候就出现问题了,一直有新出的窗口打开在我用的if判断中对handle的判断混乱,从而导致我的for循环中的新窗口的定位出问题。下面看是我解决后的代码,建议先自己想想如何实现该过程,犯过错之后才知道,错误的来源,才能学到知识,时间出真知,能想出比我更好的解决方法。

# coding = utf-8
import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(2)
#打开网址
driver.get("http://bbs.xiaomi.cn/")
time.sleep(1)

#将文字链接放入列表中
title_li=driver.find_elements_by_xpath("//ul/li[@class='theme_list clearfix']//div[@class='title']//a")
print('列表共有:',len(title_li),'个元素')

#开始遍历文字链接
for i in range(0,len(title_li)):
    handlea=driver.current_window_handle   # 获取当前页,将当前页面A赋给handlea
    
    #打印当前页A的链接文字
    atxt=title_li[i].text
    print(atxt)
    title_li[i].click()#点击文字链接
    time.sleep(1)
    handleb= driver.current_window_handle  # 获取当前页,当前页面B赋给handleb
    sreach_windows = driver.window_handles  #将当前所有handle放入列表中
    
    '''
    新建newhandle为search_windows内的元素
    判断newhandle是不是页面A如果不是就定位到newhandle
    也就是页面B
    '''
    for newhandle in sreach_windows:
        if (newhandle != handlea):
            driver.switch_to_window(newhandle)
            h_title = driver.find_element_by_xpath("//h1/span[3]") #定位页面B中的h1内的标题名称
            print(h_title.text)
            #断言文字是否匹配,如果匹配则pass,否则fail
            try:
                assert atxt == h_title.text
                print("pass")
            except Exception as e:
                print("fail")
            '''
            这是最关键的一步,在这里必须关闭新的页面,及页面B
            否则在循环遍历中或出现疯狂打开新页面的情况
            所以必须用close方法关闭窗口
            '''
            driver.close()    
            driver.switch_to_window(sreach_windows[0]) #重新定位到页面A
    time.sleep(1)
driver.quit()

 思考:

1、获取当前页A、B的位置,与click()方法的位置关系,变动变动位置会发生什么情况

1、sreach_windows = driver.window_handles所防止的位置,为什么要放在这里,这是我当时有犯过的错误

2、driver.close()所放置的位置,为什么放在这里,假如放在其他地方会怎么样,加入不放会怎么样,尝试几次

 

个人的学习笔记,仅供参考,希望有问题下方评论提问,或者有建议的下方评论提出,我会第一时间回复大家,谢谢

python获取窗口 Python获取窗口列表切换窗口_for循环