2013-11-21 2 views
2

Я пытаюсь понять различные интерфейсы, класс, реализующий интерфейс и методы в Selenium.Понимание метода findElement в Selenium

Я понял, что интерфейс SearchContext наследуется интерфейсом WebDriver и, в свою очередь, реализуется различными классами, такими как ForefoxDriver и другими.

findElement - это метод как часть интерфейса SearchContext и реализованный FirefoxDriver (поскольку FireFoxDriver реализует WebDriver).

Существует еще один класс под названием «By», который имеет множество вложенных подклассов.

Теперь синтаксис findElement, как:

driver.findElement(By.name("q")); 

Я не мог понять, параметра, который передается в метод findElement, потому что это объект, который передается в качестве параметра или какая-то другая функция вызванный внутри метод findElement?

Может ли кто-нибудь уточнить, что именно представляет собой параметр, передаваемый этой функции findElement?

спасибо.

ответ

1

Это способ выбора элементов селена, аналогичный свободному api. Это упрощает чтение для пользователей. Параметр, который вы передаете в findElement, похож на псевдоселекторный запрос, похожий на Jsoup.

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

driver.findElement(By.id("hlogo")); 

Так запрос By.name("q") в основном выбирает элемент (ы) с помощью атрибута, name="q"

+0

Спасибо, я просто googled на Fluent api, и это говорит о методе каскадирования. Следовательно, здесь By.id («hogo») является вложенным методом, где «id» - это имя метода, а «hogo» - это переданный параметр. Но «By» - это абстрактный класс в соответствии с документацией селена. Следовательно, можно ли назвать статический метод абстрактным классом? – user1925406

+0

Selenium не использует метод каскадирования, поэтому мы не можем действительно классифицировать его свободно api в соответствии с определением wiki. Что касается вашего вопроса, абстрактный класс в основном представляет собой интерфейс с некоторой реализацией. Поэтому он может содержать статические методы. Повторить, что указывает документация 'By': это _Mechanism, используемый для поиска элементов в документе_. Он делается абстрактным для пользователей, которые хотят обеспечить собственную реализацию. – Michael

+0

Если вы посмотрите [документацию findElement] (http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.html#findElement (org.openqa.selenium.By) , в качестве параметра он принимает объект 'By'.' Статический метод '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' возвращает объект 'By', который помещается в' findElement() ' – Michael

0

в процессе анализа объекта DOM, вы можете получить элемент, используя различные способы

  • вы можете получить элемент по идентификатору
  • Вы можете получить элемент по имени
  • Вы можете получить элемент его класса

Таким образом, есть различные способы, чтобы получить элемент

В селена, в то время как вы используете метод findElement, вам нужно будет сказать «используя«, вы инструктируете селен, чтобы найти элемент? используя имя или используя идентификатор или что бы это ни было.

Вот почему они дали класс By.Так что если вы хотите найти элемент с именем класса, то вы можете использовать findElement(By.ByClassName)

Если вы хотите найти элемент по идентификатору, то вы можете использовать findElement(By.ById)

см this api link

2

(Java) Согласно Селен 2 API,

#findElement(): 

    Find the first WebElement using the given method. This method is affected by the 'implicit wait' times in force at the time of execution. The findElement(..) invocation will return a matching row, or try again repeatedly until the configured timeout is reached. findElement should not be used to look for non-present elements, use findElements(By) and assert zero length response instead. 
    Specified by: findElement(...) in SearchContext 

    Parameters: 
    by The locating mechanism 

    Returns: 
    The first matching element on the current page 

    Throws: 
    NoSuchElementException - If no matching elements are found 

    See Also: 
    org.openqa.selenium.By 
    org.openqa.selenium.WebDriver.Timeouts 

findElement() принимает один аргумент. Объект класса By. Давайте посмотрим на класс By.

By.className  : Finds elements based on the value of the "class" attribute. 
By.cssSelector  : Finds elements via the driver's underlying W3 Selector engine. 
By.id    : a By which locates elements by the value of the "id" attribute. 
By.linkText  : a By which locates A elements by the exact text it displays 
By.name   : a By which locates elements by the value of the "name" attribute. 
By.partialLinkText : a By which locates A elements that contain the given link text 
By.tagName   : a By which locates elements by their tag name 
By.xpath   : a By which locates elements via XPath 

Короче говоря, это ВСЕ способы, которыми вы можете найти нужные вам элементы. Все зависит от ваших философий, на которых вы выбираете. Я лично всегда использую By.cssSelector.

Смежные вопросы