Робота з Webdriver (ч.2, звернення до об’єктів)

Selenium-WebDriver команди API і операції

Перехід на сторінку
Перше, що ви, мабуть, хочете зробити з WebDriver – це перейти до сторінки. Звичайний спосіб зробити це за викликом “отримати”:

driver.get("http://www.google.com");
driver.Url = "http://www.google.com";
driver.get "http://www.google.com"

Звернення до елементів інтерфейсу (Web Elements)
Звернення до елементу в WebDriver може бути зроблено через сам WebDriver або за допомогою WebElement. Кожен з прив’язок надає метод “Знайти елемент” і “знайти елементи”. Спочатку повертає об’єкт WebElement в іншому випадку він викликає виняток. Потім повертає список WebElements, також може повертати порожній список, якщо елементи не відповідають запиту.
Методи пошуку приймають об’єкт запитів “за” чимось. “За” чим можна звертатись до елементів перераховано нижче.


За ID
Це найбільш ефективний і кращий спосіб знайти елемент. Єдиний мінус – коли розробники інтерфейсу користувача роблять НЕ-унікальних ідентифікатори на сторінці або ідентифікатор, що генеруються автоматично. Клас HTML-елементу є більш доцільним, ніж автоматично згенерований ID.
Приклад того, як знайти елемент, який виглядає наступним чином:

<div id="coolestWidgetEvah">...</div>
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
IWebElement element = driver.FindElement(By.Id("coolestWidgetEvah"));
element = driver.find_element(:id, "coolestWidgetEvah")
element = driver.find_element_by_id("coolestWidgetEvah")

or

from selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolestWidgetEvah")

За назвою класу
“Клас” в даному випадку відноситься до атрибуту елемента DOM. Часто в практичному використанні є багато елементів DOM з тим же ім’ям класу, тому, для пошуку кількох елементів стає більш практичним варіантом в порівнянні з знаходження першого елемента (за ID).
Приклад того, як знайти елемент, який виглядає наступним чином:

<div class="cheese">
<span>Cheddar</span>
</div>
<div class="cheese">
<span>Gouda</span>
</div>
List<WebElement> cheeses = driver.findElements(By.className("cheese"));
IList<IWebElement> cheeses = driver.FindElements(By.ClassName("cheese"));
cheeses = driver.find_elements(:class_name, "cheese")

or

cheeses = driver.find_elements(:class, "cheese")
cheeses = driver.find_elements_by_class_name("cheese")

or

from selenium.webdriver.common.by import By
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")

За Тегом
DOM Tag Name елементу.

Приклад того, як знайти елемент, який виглядає наступним чином:

<iframe src="..."></iframe>
WebElement frame = driver.findElement(By.tagName("iframe"));
IWebElement frame = driver.FindElement(By.TagName("iframe"));
frame = driver.find_element(:tag_name, "iframe")
frame = driver.find_element_by_tag_name("iframe")

or

from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")

За назвою
Знайти елемент за відповідним ім’ям атрибута.

Приклад того, як знайти елемент, який виглядає наступним чином:

<input name="cheese" type="text"/>
WebElement cheese = driver.findElement(By.name("cheese"));
IWebElement cheese = driver.FindElement(By.Name("cheese"));
cheese = driver.find_element(:name, "cheese")
cheese = driver.find_element_by_name("cheese")

or

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.NAME, "cheese")

За Посиланням
Знайти елемент посилання за текстом посилання.

Приклад того, як знайти елемент, який виглядає наступним чином:

<a href="http://www.google.com/search?q=cheese">cheese</a>>
WebElement cheese = driver.findElement(By.linkText("cheese"));
IWebElement cheese = driver.FindElement(By.LinkText("cheese"));
cheese = driver.find_element(:link_text, "cheese")

or

cheese = driver.find_element(:link, "cheese")
cheese = driver.find_element_by_link_text("cheese")

or

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")

За частиною посилання
Знайти елемент посилання з частковою відповідністю видимого тексту.

Приклад того, як знайти елемент, який виглядає наступним чином:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
IWebElement cheese = driver.FindElement(By.PartialLinkText("cheese"));
cheese = driver.find_element(:partial_link_text, "cheese")
cheese = driver.find_element_by_partial_link_text("cheese")

or

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "cheese")

За CSS
Як випливає з назви це метод знаходження CSS. Браузер за замовчуванням підтримує, тому, будь ласка, зверніться до списку W3C загальнодоступних CSS селекторів. Якщо браузер не має вбудованої підтримки для CSS запитів, тоді використовується Sizzle. IE 6,7 і FF3.0 в даний час використовують Sizzle як двигун обробки CSS запиту.

Пам’ятайте, що не всі браузери були створені рівними, деякі CSS, які можуть працювати в одній версії можуть не працювати в іншій.

Приклад, як знайти сир з коду нижче:

<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
IWebElement cheese = driver.FindElement(By.CssSelector("#food span.dairy.aged"));
cheese = driver.find_element(:css, "#food span.dairy.aged")
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")

or

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")

За XPATH
На високому рівні, WebDriver використовує вбудовані можливості браузера XPath скрізь, де це можливо. На тих браузерів, які не мають вбудовану підтримку XPath, WebDriver надає власну реалізацію. Це може привести до деякої несподіваної поведінки, якщо ви не обізнані про відмінності в різних версіях XPath.

Драйвер Назва тегу і атрибуту Значення атрибутів Вбудована підтримка xpath
Драйвер Htmlunit У нижньому регістрі Як вони відображаються в HTML Так
Драйвер Internet Explorer У нижньому регістрі Як вони відображаються в HTML Ні
Драйвер Firefox Чутливий до регістру Як вони відображаються в HTML Так

Це досить абстрактно, тому на наступний шматок коду HTML:

<input type="text" name="example" />
<INPUT type="text" name="other" />

Код знаходження елемента, що нам потрібен, буде таким:

List inputs = driver.findElements(By.xpath("//input"));
IList inputs = driver.FindElements(By.XPath("//input"));
inputs = driver.find_elements(:xpath, "//input")
inputs = driver.find_elements_by_xpath("//input")

or

from selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")

Наступна кількість збігів буде знайдена:

Вираз XPath Драйвер Htmlunit Драйвер Firefox Драйвер Internet Explorer
//input 1 (“example”) 2 2
//INPUT 0 2 0

Іноді HTML елементам не потрібні атрибути, які будуть оголошені явно, бо вони будуть за замовчуванням відомі. Наприклад, тег для вводу тексту не вимагає наявності атрибута “тип”, тому що він за замовчуванням “текст”. Правило використання XPath в WebDriver полягає в тому, що ви не повинні чекати, щоб бути в змозі відповідати за ці неявні атрибути.


За JavaScript
Ви можете виконати довільний JavaScript, щоб знайти елемент, і як тільки ви повернути DOM елемент, він буде автоматично перетворений в об’єкт WebElement.

Простий приклад на сторінці, яка завантажує JQuery:

WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
IWebElement element = (IWebElement) ((IJavaScriptExecutor)driver).ExecuteScript("return $('.cheese')[0]");
element = driver.execute_script("return $('.cheese')[0]")
element = driver.execute_script("return $('.cheese')[0]")

Знаходження всіх елементів для вводу тексту на сторінці:

List labels = driver.findElements(By.tagName("label"));
List inputs = (List) ((JavascriptExecutor)driver).executeScript(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);
IList labels = driver.FindElements(By.TagName("label"));
IList inputs = (IList) ((IJavaScriptExecutor)driver).ExecuteScript(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);
labels = driver.find_elements(:tag_name, "label")
inputs = driver.execute_script(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels)
labels = driver.find_elements_by_tag_name("label")
inputs = driver.execute_script(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels)