Робота з 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 для отримання додаткової інформації.

We #StandWithUkraine.
Learn how you can help too!

#Stand­With­Ukraine

We don't know how long the war will last. But what we do know is that we can't stand aside and watch.

The fastest way you can help too is to support Ukraine financially. The National Bank of Ukraine (NBU) has opened a multi-currency account for that purpose. Learn more

This account accepts donations in US, Canadian and Australian dollars, euros, British pounds, Swiss francs, yuan and yen.

UA823000010000032302338301027

Also accepting cryptocurrency donations – the fastest way to help. Learn more

BTC – 357a3So9CbsNfBBgFYACGvxxS6tMaDoa1P

ETH, USDT (ERC-20) – 0x165CD37b4C644C2921454429E7F9358d18A45e14

Spread the word!