1

У меня есть 10 ссылок в списке, после нажатия которых откроется новое окно. Различные ссылки будут приводить к разному набору страниц, однако у меня есть 3 общих элемента для всех 10 ссылок.python try-except, обработка исключений

Ниже приведен пример функции.

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() 

Я не знаю, как я оценить результаты «попробовать блок 2», так что делать какие-то действия в блоке 1. Любые возможные решения?

ответ

2

Если "element1" и т.д., предназначены для CSS селекторы, наиболее эффективным способом было бы:

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

(. Я переименовал is_exist_in_new_window в exists_in_new_window) , оператор в CSS означает "или". Поэтому селектор CSS, переданный в exists_in_new_window, означает, что вы ищете «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))) 

Этого метод вызывает как минимум min(1, len(elements)) круглых поездок между клиентом селена и браузером и максимумом 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() возвращается True или False.

Надеюсь, что это поможет.

Смежные вопросы