Как сделать выборку всего-всего?

Интересует, какие есть возможности у вэбдрайвера в плане выборок.

Заметил, что TagName и CSS положительно реагируют на звёздочку (asterisk), XPath выдаёт нехотя, другие же способы выборки или отваливают сразу, или ничего не отдают.

Поискал по доке, наткнулся (почему-то в разделе Selenium IDE) на частичную поддержку wildcards, названную globbing'ом.

1) насколько это поддерживается драйвером? почему tagname выдаёт на звёздочку некий набор элементов, а name, classname -нет? Обламывается на элементах, где этих атрибутов нет? Отчего ClassName отвечает эксепшеном, а остальные способы - нет?

2) А есть способ получить всё-всё? (на вопрос "зачем?" - хотя бы сделать нормальную поддержку wildcard)

3) можно ли выбрать сразу по нескольких критериям (by'ям) или надо сначала по одному, потом сузить выборку по второму и т.д.?

 

Поясню на примере гуглёвой страницы. стартуем хром и навигируем на google.com

 

PS C:\Users\Alexander> (Get-SeWebElementCollection -TagName '*' | %{ $_.TagName;}).count
237
 
PS C:\Users\Alexander> (Get-SeWebElementCollection -Name '*' | %{ $_.TagName;}).count
Get-SeWebElementCollection : The timeout expired for WebElement with Name = "*" (это моя ошибка. Означает, что за дефолтное время драйвер ничего не выдал, но и не было эксепшена)
At line:1 char:2
+ (Get-SeWebElementCollection -Name '*' | %{ $_.TagName;}).count
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationTimeout: (:) [Get-SeWebElementCollection], Exception
    + FullyQualifiedErrorId : TimeoutExpired,SePSX.Commands.GetSeWebElementCollectionCommand
 
PS C:\Users\Alexander> (Get-SeWebElementCollection -CSS '*' | %{ $_.TagName;}).count
237
 
PS C:\Users\Alexander> (Get-SeWebElementCollection -XPath '*' | %{ $_.TagName;}).count
1
 
PS C:\Users\Alexander> (Get-SeWebElementCollection -Class '*' | %{ $_.TagName;}).count
Get-SeWebElementCollection : Could not find an element by its ClassName = "*" (это эксепшн драйвера)
At line:1 char:2
+ (Get-SeWebElementCollection -Class '*' | %{ $_.TagName;}).count
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-SeWebElementCollection], Exception
    + FullyQualifiedErrorId : FailedToFindElements,SePSX.Commands.GetSeWebElementCollectionCommand
 
PS C:\Users\Alexander> (Get-SeWebElementCollection -LinkText '*' | %{ $_.TagName;}).count
Get-SeWebElementCollection : The timeout expired for WebElement with LinkText = "*" (это моя ошибка. Означает, что за дефолтное время драйвер ничего не выдал, но и не было эксепшена)
At line:1 char:2
+ (Get-SeWebElementCollection -LinkText '*' | %{ $_.TagName;}).count
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationTimeout: (:) [Get-SeWebElementCollection], Exception
    + FullyQualifiedErrorId : TimeoutExpired,SePSX.Commands.GetSeWebElementCollectionCommand
 
PS C:\Users\Alexander> (Get-SeWebElementCollection -Id '*' | %{ $_.TagName;}).count
Get-SeWebElementCollection : The timeout expired for WebElement with Id = "*" (это моя ошибка. Означает, что за дефолтное время драйвер ничего не выдал, но и не было эксепшена)
At line:1 char:2
+ (Get-SeWebElementCollection -Id '*' | %{ $_.TagName;}).count
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationTimeout: (:) [Get-SeWebElementCollection], Exception
    + FullyQualifiedErrorId : TimeoutExpired,SePSX.Commands.GetSeWebElementCollectionCommand
 
Итого, имеем четыре результата для астериска:
TagName и CSSValue возвращают 237
XPath возвращает 1
ClassName возвращает эксепшн
Name, Id, LinkText, наверное, и PartialLinkText - ничего не возвращают, но и нет эксепшена
 
Какую стратегию выборки вы мне посоветуете избрать? По TagName? По CSSValue? Кто-нибудь где-нибудь видел описание этой логики? (читать сорцы драйверОВ не хочу :)) Наверное, по TagName - они же всегда есть...

Читать исходники Selenium не поможет, надо читать документацию :)

Selenium достаточно простая штука, он сам ничего не ищет, это делает браузер. Поиск по тегу, по имени и по классу осуществляется при помощи соответствующих функций JavaScript:
https://developer.mozilla.org/en-US/docs/DOM/document.getElementsByTagName
https://developer.mozilla.org/en-US/docs/DOM/document.getElementsByName
https://developer.mozilla.org/en-US/docs/DOM/document.getElementsByClassName

Согласно спецификации, поиск по тегу может принимать специальное значение '*', и это означает "любой тег". Другие методы поиска не предоставляют такой возможности.

Что касается CSS и XPath -- это сложные языки запросов, опять таки -- читайте документацию. Чтобы получить всё-всё, нужно использовать XPath-запрос '//*', а не просто звёздочку.

Кстати, вот тут я уже должен предупредить о возможных проблемах с производительностью, когда речь идёт о больших коллекциях элементов (а всё-всё -- это может быть большая коллекция). Дело в том, что Selenium общается с браузером по сети, и передаваемые данные (найденные элементы) сначала упаковываются на стороне браузера в формат JSON, потом передаются в Selenium, и там распаковываются обратно. Именно здесь могут подстерегать проблемы с производительностью -- чем больше коллекции, тем больше будет этих расходов на упаковку-передачу-распаковку.

в общем вы смешали все в кучу, 

вам необходимо сначала посмотреть на технологии, которые используются и потом станет все ясно

dom - http://www.w3schools.com/htmldom/default.asp

css - http://www.w3schools.com/cssref/css_selectors.asp

xpath - http://www.w3schools.com/xpath/

тогда вам станет понятно, что * означает совсем разные вещи в разных контекстах

 

хотел бы еще добавить на счет выборки локаторов,

надо выбирать те локторы, которые доступны вам

а для этого вам надо происследовать ваш исходный код вашей страницы и уже от этого выбирать,

каким способом потом вебдрайвер будет находит этот же элемент(ы)

Спасибо за линки и за то, что разъяснили, что делает драйвер, а что - браузер. Этого я, конечно, не знал.

 

Я поискал поиском же на сайте селениума, нашёл что-то похожее в хелпе по IDE http://seleniumhq.org/docs/02_selenium_ide.html и подумал, что звёздочка относится ко всем видам выборок. :)

 

Вот ещё где бы надыбать множество разнообразных вэб-стриничек, чтобы проверить скорость и полноту выборок...