python try-except,异常处理

时间:2014-03-06 02:24:51

标签: python-2.7 selenium exception-handling selenium-webdriver

列表中有10个链接,点击后会打开一个新窗口。不同的链接会产生不同的页面集,但是我有10个链接的常用元素。

以下是功能示例。

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 block 2'的结果,以便在第1块中执行某些操作。 任何可能的解决方

2 个答案:

答案 0 :(得分: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

希望有所帮助。

答案 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中的,运算符表示“或”。因此传递给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)))

此方法导致Selenium客户端和浏览器之间的最小min(1, len(elements))次往返,最多len(elements),具体取决于页面上的内容。