Робота з Webdriver (ч.3, робота з об’єктами)

Заповнення форм
Ми вже бачили, як ввести текст в текстове поле, але як щодо інших елементів? Ви можете “перемикання” стан чекбоксів, і ви можете використовувати “натиснути”, щоб встановити якусь опцію. Робота з елементами вибору також не складна:

WebElement select = driver.findElement(By.tagName("select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
    System.out.println(String.format("Value is: %s", option.getAttribute("value")));
    option.click();
}
IWebElement select = driver.FindElement(By.TagName("select"));
IList<IWebElement> allOptions = select.FindElements(By.TagName("option"));
foreach (IWebElement option in allOptions)
{
    System.Console.WriteLine("Value is: " + option.GetAttribute("value"));
    option.Click();
}
select = driver.find_element(:tag_name, "select")
all_options = select.find_elements(:tag_name, "option")
all_options.each do |option|
  puts "Value is: " + option.attribute("value")
  option.click
end
select = driver.find_element_by_tag_name("select")
allOptions = select.find_elements_by_tag_name("option")
for option in allOptions:
    print "Value is: " + option.get_attribute("value")
    option.click()

Це знайде перший елемент вибору на сторінці, і в циклі знайде усі його варіанти, виведе їх значення і, вибравши кожен в свою чергу. Як ви помітили, це не найефективніший спосіб боротьби, щоб вибрати елементи.


Класи підтримки WebDriver включають в себе один, який називається “Select”, який містить корисні методи для взаємодії з ними.

Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");
SelectElement select = new SelectElement(driver.FindElement(By.TagName("select")));
select.DeselectAll();
select.SelectByText("Edam");
# available since 2.14
    select = Selenium::WebDriver::Support::Select.new(driver.find_element(:tag_name, "select"))
    select.deselect_all()
    select.select_by(:text, "Edam")
# available since 2.12
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_tag_name("select"))
select.deselect_all()
select.select_by_visible_text("Edam")

Це скасує всі опції вибору з першого елемента вибору на сторінці, а потім вибере варіант з текстом “Едам”.


Після того, як ви закінчили заповнювати форму, ви, ймовірно, хочете, щоб відправити її. Один зі способів зробити це знайти кнопку “submit” і натиснути її:

driver.findElement(By.id("submit")).click();
driver.find_element(:id, "submit").click
driver.find_element_by_id("submit").click()

Крім того, WebDriver має зручний метод “відправляти” для кожного елемента. Якщо ви застосуєте його до елемента у формі, WebDriver піде вгору по DOM, поки не знайде форму, що “обгортає” цей елемент, а потім викликає метод для відправки. Якщо елемент не в формі, то буде показана помилка NoSuchElementException:

element.submit();
element.submit

Переміщення між вікнами і кадрами
Деякі веб-додатки мають багато кадрів або кілька вікон. WebDriver підтримує переміщення між зазначеними вікнами, використовуючи метод “switchTo”:

driver.switchTo().window("windowName");
driver.switch_to.window("windowName")

Всі виклики до драйвера будуть інтерпретуватися як спрямовані до конкретного вікна. Але, як ви знаєте ім’я вікна? Погляньте на JavaScript або посилання, що відкриває його:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

Крім того, ви можете передати “дескриптор вікна» методу «switchTo().window()”. Знаючи це, можна перебрати всі відкриті вікна наступним чином:

for (String handle : driver.getWindowHandles()) {
    driver.switchTo().window(handle);
}
driver.window_handles.each do |handle|
    driver.switch_to.window handle
end
for handle in driver.window_handles:
    driver.switch_to.window(handle)

Ви також можете перейти від кадру до кадру (або до кадрів):

driver.switchTo().frame("frameName");
driver.switch_to.frame "frameName"
driver.switch_to.frame("frameName")

Cпливаючі діалогові вікна
Починаючи з Selenium 2.0 Beta 1, є вбудована підтримка обробки діалогових спливаючих вікон. Після того як ви викликали дії, які відкрили так вікно, ви можете отримати доступ за допомогою наступного коду:

Alert alert = driver.switchTo().alert();
Alert alert = driver.SwitchTo().Alert();
alert = driver.switch_to.alert
alert = driver.switch_to.alert
# usage: alert.dismiss(), etc.

Це поверне відкритий об’єкт оповіщення. З цією метою ви можете прийняти, відхилити, прочитати його вміст або навіть ввести запрос. Цей інтерфейс працює однаково добре на попередження, підтвердження і запити. Зверніться до JavaDocs або RubyDocs для отримання додаткової інформації.