Используя список понимание создало бы временный список, который мог съесть всю Вашу память, если искавшая последовательность является большой. Даже если последовательность не является большой, создавание списка означает выполнять итерации по всей последовательности, прежде чем in
мог запустить ее поиск.
временный список может избегать при помощи выражения генератора:
foo = 12
foo in (obj.id for obj in bar)
Теперь, целых obj.id == 12
близость запуск bar
, поиск будет быстр, даже если bar
будет бесконечно длинно.
Как @Matt предложенный, это - хорошая идея использовать hasattr
, если какой-либо из объектов в bar
может отсутствовать id
атрибут:
foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
Чтобы определить, что элемент видим, вы используете предложение:
not (contains (@style, "display: none")
Лучше использовать это:
visible_clause = "not(ancestor::*[contains(@style,'display: none')" +
" or contains(@style, 'visibility: hidden') " +
" or contains(@class,'x-hide-display')])"
hidden_clause = "parent::*[contains(@style,'display: none')" +
" or contains(@style, 'visibility: hidden')" +
" or contains(@class,'x-hide-display')]"
Для сложного пользовательского интерфейса, который не является формальным HTML, xPath - это всегда то, на что вы можете рассчитывать, но немного сложно, когда дело доходит до различных реализаций пользовательского интерфейса с использованием ExtJs.
Вы можете использовать Firebug и Firexpath в качестве расширений firefox для проверки xpath определенного элемента, и просто передать полный xpath в качестве параметра в selenium.
Например, в коде java:
String fullXpath = "xpath=//div[@id='mainDiv']//div[contains(@class,'x-grid-row')]//table/tbody/tr[1]/td[1]//button"
selenium.click(fullXpath);