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