Одним из основных принципов необработанного API WebDriver является ожидание того, что пользователь знает состояние DOM для автоматизируемой страницы. Это означает, что в логике API вызов findElement
с использованием локатора несуществующего элемента является исключительным условием, что делает исключение совершенно легитимным. Хотя можно утверждать, что ожидание, встроенное в поведение API, ошибочно, это выходит за рамки этого ответа. Если вам нужна логическая логика для определения того, существует ли элемент, вам нужен метод-обертка, как вы уже обнаружили. В рамках этого метода оболочки у вас есть два варианта:
Используйте findElement
и поймайте NoSuchElementException
. Обратите внимание, что использование WebDriverWait
неявно ловит это исключение для вас, как и семантический эквивалент.
Используйте findElements
(обратите внимание на «s»), который возвращает пустой список без исключения, если элемент не существует.
В Python 2.6 +
import itertools
for element in itertools.product(*somelists):
print(element)
Документация: Python 3 - itertools.product
import itertools
>>> for i in itertools.product([1,2,3],['a','b'],[4,5]):
... print i
...
(1, 'a', 4)
(1, 'a', 5)
(1, 'b', 4)
(1, 'b', 5)
(2, 'a', 4)
(2, 'a', 5)
(2, 'b', 4)
(2, 'b', 5)
(3, 'a', 4)
(3, 'a', 5)
(3, 'b', 4)
(3, 'b', 5)
>>>
Для Python 2.5 и более старый:
>>> [(a, b, c) for a in [1,2,3] for b in ['a','b'] for c in [4,5]]
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4),
(2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5),
(3, 'b', 4), (3, 'b', 5)]
Вот рекурсивная версия product()
(просто иллюстрация):
def product(*args):
if not args:
return iter(((),)) # yield tuple()
return (items + (item,)
for items in product(*args[:-1]) for item in args[-1])
Пример:
>>> list(product([1,2,3], ['a','b'], [4,5]))
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4),
(2, 'a', 5), (2, 'b', 4), (2, 'b', 5), (3, 'a', 4), (3, 'a', 5),
(3, 'b', 4), (3, 'b', 5)]
>>> list(product([1,2,3]))
[(1,), (2,), (3,)]
>>> list(product([]))
[]
>>> list(product())
[()]
import itertools
result = list(itertools.product(*somelists))
В Python 2.6 и выше Вас может использовать 'itertools.product'. В более старых версиях Python можно использовать следующее (почти - см. документацию), эквивалентный код из документации , по крайней мере, как начальная точка:
def product(*args, **kwds):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
результатом обоих является итератор, поэтому при реальной необходимости в списке для обработки furthert используйте list(result)
.
подход Стоунхенджа:
def giveAllLists(a, t):
if (t + 1 == len(a)):
x = []
for i in a[t]:
p = [i]
x.append(p)
return x
x = []
out = giveAllLists(a, t + 1)
for i in a[t]:
for j in range(len(out)):
p = [i]
for oz in out[j]:
p.append(oz)
x.append(p)
return x
xx= [[1,2,3],[22,34,'se'],['k']]
print(giveAllLists(xx, 0))
вывод:
[[1, 22, 'k'], [1, 34, 'k'], [1, 'se', 'k'], [2, 22, 'k'], [2, 34, 'k'], [2, 'se', 'k'], [3, 22, 'k'], [3, 34, 'k'], [3, 'se', 'k']]