前两天在自动化测试学习中遇到了一个问题,从当前页面点击链接到新窗口,然后判断新窗口的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()所放置的位置,为什么放在这里,假如放在其他地方会怎么样,加入不放会怎么样,尝试几次
个人的学习笔记,仅供参考,希望有问题下方评论提问,或者有建议的下方评论提出,我会第一时间回复大家,谢谢