前言:自動化測試存在比較多的使用限制,會存在某段時間無法使用的生疏期。通過這篇文章記錄項目編寫程序中遇到的問題以及解決思路,希望對以后的自動化開發能有些幫助。
本篇記錄5個問題:
問題6:獲取列表中,整行整列數據的方法
問題7:數據無法獲取眾多原因之一:列表中同一位置元素,html格式不同。
問題8:for循環與try使用錯誤
問題9:確認網頁是否打開的方法之一:使用title
問題10:selenium操作下拉選項內容
?
問題6:獲取列表中,整合整理額數據的方法:
? ? ? ? 操作網頁中,經常會出現列表,如果使用selenium獲取一個列表的所有數據。目前可行的方法核心是For循環+Xpath路徑。
1.? 獲取整個表單tbody的xpath路徑:list = driver.find_element_by_xpath("http://*[@id="***"]/tbody")
2. 獲取有效數據第一行,第一列的數據: test_click = list.driver.find_element_by_xpath("http://*[@id="***"]/tbody/tr[1]/td[1]/b")。這一步實際上可以不應用list,引用list能夠將范圍縮小到特定的列表。如果頁面只有一個列表,則不需要獲取list
3. 獲取有效數據第二行,第一列的數據:test_click2 =?list.driver.find_element_by_xpath("http://*[@id="***"]/tbody/tr[2]/td[1]/b")
4. 獲取有效數據第一行,第二列的數據:test_click3 = list.driver.find_element_by_xpath("http://*[@id="***"]/tbody/tr[1]/td[2]/b")
按照規律,如果想要獲取某個特定列的數據則:
test_list = []
for?i?in range(1,最大列個數):
? ? test_list.append(list.driver.find_element_by_xpath("http://*[@id="***"]/tbody/tr[{}]/td[1]/b".format(i)))
取特定行也類似。
?
問題7:數據無法獲取眾多原因之一:列表中同一位置元素,html格式不同。
? ? ? ?html頁面中部分字段由于顯示內容不同,html中的名稱內容也不同。selenium如果不做處理,就會導致程序運行到某一步因找不到元素而報錯。NoSuchElementException。處理這種問題,常用 異常處理【 try,except,else,final】
? ? ? ?
try: //某個字段可能由于內容不同導致html格式不同,無法使用同一個xpath獲取到 Status = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/b'%count).text except NoSuchElementException: //取不到字段的時候,就開始運行另一種形式 Status = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/font/b/b' % count) count_parren = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[4]/'% count).text count = re.search('\(\d\)', count_parren).group() final: driver.quit() //最后退出瀏覽器
問題8:for循環與try使用錯誤
? ? ? ? 主要是對try使用方法的不理解,導致的問題。
? ? ? ? try:當執行其中的方法出現錯誤后,就會直接跳出try中的代碼。相當于發現報錯,就執行了break。所以當try中寫入了for循環后,任何一次執行內容出現了異常,都會跳出整個for循環。
? ? ? ? 解決方法也很簡單,值需要將try寫到for循環中。
for count in range(1,len(Application_List)+1): try: Applation = table.find_element_by_xpath('//*[@id="instances"]/tbody/tr[%s]/td[1]/b'%count).text except NoSuchElementException: break
問題9:確認網頁是否打開的方法之一:使用title
? ? ? ? 有個自動化需求的描述是,訪問地址判斷服務是否啟動。接到需求的時候,考慮捕捉該網址特定的字段,能夠捕捉到就算啟動了。這種方案的問題在于,每個頁面的內容不一致,每個都需要寫,很要命。所以就想有沒有一個所有頁面都使用但是內容還各不相同的用于區別頁面以及驗證是否啟動。這個時候就先到了,Title
? ? ? ? selenium中也有取title的方法:driver.title
? ? ? ? 開發內容就分為了兩步:第一步,根據提供的地址獲取title,寫入配置文件中。
第一步,只是取title的過程用自動化執行了,然后打印出title,復制粘貼到excel里。當然也可以直接寫入excle,就是比較麻煩,一次性完成的內容,還是手動操作能快些。
第二部,實際測試的時候,取title與配置文件中的比較。
for Key, Value in URL_Dict.items(): # 驗證內容正確性 driver = browser_config['chrome']() uihandle = UIHandle(driver) try: uihandle.get(Value[0]) sleep(2) # 獲取登陸頁面的Title信息 Server_Title = driver.title # 獲取的Title與config中的title比較,如果不同,則說明頁面沒啟動 if Server_Title == Value[1]: # print("{Key}:{url} 已經啟動".format(Key = Key, url = Value[0])) self.TestReport['Total_Success'] += 1 else: print('*'* 50) print("{Key}:{url} 環境未啟動".format(Key = Key, url = Value[0])) self.TestReport['Total_Failures'] += 1 self.TestReport["Error_Report"].append("""{Key}:{url} 該地址未完成啟動 """.format(Key=Key, url=Value[0])) except InvalidArgumentException: self.TestReport["Error_Report"].append("""{Key}:{url} 該地址無法訪問 """.format(Key = Key, url = Value[0])) self.TestReport['Total_Failures'] += 1 finally: driver.quit()
問題10:selenium操作下拉選項內容
? ? ? ? UI自動化經常會需要點擊一些下拉選項。目前可行的方法是,先獲取控件位置以及選項位置。然后先點擊控件再點擊選項。就能夠完成選項選擇
uihandle.Click("前端", '性別選型') uihandle.Click("前端", '男')
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
