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