2014-03-06 137 views
1

我有一個列表中的10個鏈接,點擊後,這將打開一個新的窗口。不同的鏈接會產生不同的頁面集,但是我對所有10個鏈接都有3個共同元素。蟒蛇嘗試除了異常處理

以下是功能示例。

def handle_window(self): 
    self.driver.go_to_new_window() 

    try: # block 1 
     elements = ["element1", "element2", "element3"] 
     for element in elements: 

      try: #block 2 
       self.assertEqual(True, is_exist_in_new_window(element))) 
      except: 
       continue 

    except: 
     # in 'try block 2' if assert yields true at least once, 
     print 'passed' 
     # if it fails for all 3 elements, 
     print 'failed' 
    self.driver.close_current_window() 
    self.driver.go_to_main_window() 

我不知道如何評估的結果「try塊2」,這樣在塊1 任何可能的解決方案做一些動作?

回答

2

如果"element1"等等都意味着是CSS選擇器,最有效的方法是:

elements = ["element1", "element2", "element3"] 
self.assertTrue(exists_in_new_window(",".join(elements))) 

(我已經改名爲is_exist_in_new_windowexists_in_new_window)的,運營商CSS手段 「或」。因此,傳遞給exists_in_new_window的CSS選擇器意味着您正在查找「element1」或「element2」或「element3」。無論如何,這樣做都需要Selenium客戶端和瀏覽器之間的一次往返。請注意,上面的代碼並不意味着處理elements是零長度列表的情況。

使用XPath選擇器,您可以使用|運算符執行類似的轉換。在這種情況下,我想另外使用括號來保存單個選擇器的語義,如"(" + ")|(".join(elements) + ")"。 (我相信由於CSS的語法非常嚴格,CSS中不會出現語義問題)。

在更一般的情況下,不可能將搜索標準組合到一個表達式中,可以回退到alecxe的建議:

elements = ["element1", "element2", "element3"] 
self.assertTrue(any((exists_in_new_window(element) for element in elements))) 

此方法導致最少的硒客戶端和瀏覽器,並根據對什麼是當前頁面上的最大的len(elements)之間min(1, len(elements))往返。

2

您可以使用any()來檢查,如果頁面上存在至少一個元素:

elements = ["element1", "element2", "element3"] 
value = any((is_exist_in_new_window(element) for element in elements)) 
self.assertTrue(value) 

此代碼假定is_exist_in_new_window()返回TrueFalse

希望有所幫助。