前兩天在自動化測試學習中遇到了一個問題,從當前頁面點擊鏈接到新窗口,然後判斷新窗口的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()所放置的位置,爲什麼放在這裏,假如放在其他地方會怎麼樣,加入不放會怎麼樣,嘗試幾次
個人的學習筆記,僅供參考,希望有問題下方評論提問,或者有建議的下方評論提出,我會第一時間回覆大家,謝謝