列表中有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块中执行某些操作。 任何可能的解决方
答案 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()
返回True
或False
。
希望有所帮助。
答案 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)
,具体取决于页面上的内容。