selenium-webdriver
Поиск веб-элементов
Поиск…
Синтаксис
- ByChained (params By [] bys)
замечания
Элементы находятся в Selenium с помощью локаторов и класса By
. Чтобы создать надежный проект автоматизации с Selenium, нужно использовать локаторы для Web Elements. Локаторы должны быть описательными, уникальными и вряд ли измениться, поэтому вы не получите ложных срабатываний в тестах, например. Приоритет заключается в использовании:
- ID - поскольку он уникален, и вы получите именно тот элемент, который вы хотите.
- Имя класса - оно описательно и может быть уникальным в данном контексте.
- CSS ( более высокая производительность, чем xpath ) - для более сложных селекторов.
- XPATH - где CSS нельзя использовать ( XPATH Axis ), например
div::parent
.
Остальные локаторы подвержены изменениям или рендерингу, и их предпочтительно избегать.
Правило большого пальца: если ваш код не может найти определенный элемент, одна из причин может заключаться в том, что ваш код не дождался загрузки всех элементов DOM. Подумайте о том, чтобы ваша программа «подождала» в течение короткого периода времени (попробуйте 3-5 секунд, а затем медленно увеличивайте по мере необходимости) перед поиском указанного элемента. Вот пример в Python, взятый из этого вопроса :
from selenium import webdriver
import time
browser = webdriver.Firefox()
browser.get("https://app.website.com")
reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# Element not found! Try giving time for the browser to download all DOM elements:
time.sleep(10)
reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# This returns correct value!
Поиск элементов страницы с помощью WebDriver
Чтобы взаимодействовать с WebElements на веб-странице, сначала нам нужно определить местоположение элемента.
К является ключевым словом доступны селеном.
Вы можете найти элементы By ..
- По идентификатору
- По названию класса
- По TagName
- По имени
- По тексту ссылки
- По частичной текстовой ссылке
- С помощью CSS Selector
- По XPath
- Использование JavaScript
Рассмотрим пример ниже сценария
<form name="loginForm">
Login Username: <input id="username" name="login" type="text" />
Password: <input id="password" name="password" type="password" />
<input name="login" type="submit" value="Login" />
В приведенном выше коде имя пользователя и пароль задаются с использованием идентификаторов. Теперь вы собираетесь идентифицировать элементы с id.
driver.findElement(By.id(username));
driver.findElement(By.id(password));
Поскольку селен поддерживает 7 разных языков, этот документ дает вам представление о местонахождении элементов на всех языках.
По идентификатору
Пример того, как найти элемент с помощью ID:
<div id="coolestWidgetEvah">...</div>
Java - WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
C# - IWebElement element = driver.FindElement(By.Id("coolestWidgetEvah"));
Python - element = driver.find_element_by_id("coolestWidgetEvah")
Ruby - element = driver.find_element(:id, "coolestWidgetEvah")
JavaScript/Protractor - var elm = element(by.id("coolestWidgetEvah"));
По названию класса
Пример того, как найти элемент с именем класса:
<div class="cheese"><span>Cheddar</span></div>
Java - WebElement element = driver.findElement(By.className("cheese"));
C# - IWebElement element = driver.FindElement(By.ClassName("cheese"));
Python - element = driver.find_element_by_class_name("cheese")
Ruby - cheeses = driver.find_elements(:class, "cheese")
JavaScript/Protractor - var elm = element(by.className("cheese"));
По названию тега
Пример того, как найти элемент с именем тега:
<iframe src="..."></iframe>
Java - WebElement element = driver.findElement(By.tagName("iframe"));
C# - IWebElement element = driver.FindElement(By.TagName("iframe"));
Python - element = driver.find_element_by_tag_name("iframe")
Ruby - frame = driver.find_element(:tag_name, "iframe")
JavaScript/Protractor - var elm = element(by.tagName("iframe"));
По имени
Пример того, как найти элемент с именем:
<input name="cheese" type="text"/>
Java - WebElement element = driver.findElement(By.name("cheese"));
C# - IWebElement element = driver.FindElement(By.Name("cheese"));
Python - element = driver.find_element_by_name("cheese")
Ruby - cheese = driver.find_element(:name, "cheese")
JavaScript/Protractor - var elm = element(by.name("cheese"));
По тексту ссылки
Пример того, как найти элемент, используя текст ссылки:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
Java - WebElement element = driver.findElement(By.linkText("cheese"));
C# - IWebElement element = driver.FindElement(By.LinkText("cheese"));
Python - element = driver.find_element_by_link_text("cheese")
Ruby - cheese = driver.find_element(:link, "cheese")
JavaScript/Protractor - var elm = element(by.linkText("cheese"));
По частичной текстовой ссылке
Пример того, как найти элемент с использованием текста частичной ссылки:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
Java - WebElement element = driver.findElement(By.partialLinkText("cheese"));
C# - IWebElement element = driver.FindElement(By.PartialLinkText("cheese"));
Python - element = driver.find_element_by_partial_link_text("cheese")
Ruby - cheese = driver.find_element(:partial_link_text, "cheese")
JavaScript/Protractor - var elm = element(by.partialLinkText("cheese"));
С помощью селекторов CSS
Пример того, как найти элемент с помощью селекторов CSS:
<div id="food" class="dairy">milk</span>
Java - WebElement element = driver.findElement(By.cssSelector("#food.dairy")); //# is used to indicate id and . is used for classname.
C# - IWebElement element = driver.FindElement(By.CssSelector("#food.dairy"));
Python - element = driver.find_element_by_css_selector("#food.dairy")
Ruby - cheese = driver.find_element(:css, "#food span.dairy.aged")
JavaScript/Protractor - var elm = element(by.css("#food.dairy"));
Вот статья о создании селекторов CSS: http://www.w3schools.com/cssref/css_selectors.asp
По XPath
Пример того, как найти элемент с помощью XPath:
<input type="text" name="example" />
Java - WebElement element = driver.findElement(By.xpath("//input"));
C# - IWebElement element = driver.FindElement(By.XPath("//input"));
Python - element = driver.find_element_by_xpath("//input")
Ruby - inputs = driver.find_elements(:xpath, "//input")
JavaScript/Protractor - var elm = element(by.xpath("//input"));
Вот статья о XPath: http://www.w3schools.com/xsl/xpath_intro.asp
Использование JavaScript
Вы можете выполнить произвольный javascript для поиска элемента и до тех пор, пока вы вернете элемент DOM, он будет автоматически преобразован в объект WebElement.
Простой пример на странице с загруженным jQuery:
Java - WebElement element = (WebElement)
((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
C# - IWebElement element = (IWebElement)
((IJavaScriptExecutor)driver).ExecuteScript("return $('.cheese')[0]");
Python - element = driver.execute_script("return $('.cheese')[0]");
Ruby - element = driver.execute_script("return $('.cheese')[0]")
JavaScript/Protractor -
Обратите внимание: этот метод не будет работать, если ваш WebDriver не поддерживает JavaScript, например SimpleBrowser .
Выбор по нескольким критериям [C #]
Также можно использовать селекторы вместе. Это делается с помощью объекта OpenQA.Selenium.Support.PageObjects.ByChained
:
element = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));
Любое число By
s может быть закодировано и используется как выбор типа И (т. Е. Все By
s совпадают)
Выбор элементов перед загрузкой страницы
При вызове driver.Navigate().GoToUrl(url);
, выполнение кода останавливается, пока страница не будет полностью загружена. Иногда это необязательно, когда вы просто хотите извлечь данные.
Примечание. Образцы кода ниже можно считать хаками. Нет никакого «официального» способа сделать это.
Создать новый поток
Создайте и запустите поток для загрузки веб-страницы, затем используйте Wait .
C #
using (var driver = new ChromeDriver())
{
new Thread(() =>
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
}).Start();
new WebDriverWait(driver, TimeSpan.FromSeconds(10))
.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='summary']/h3/a")));
}
Использовать таймауты
Используя WebDriverTimeout, вы можете загрузить страницу, и через определенный промежуток времени она выдает исключение, которое заставит страницу останавливать загрузку. В блоке catch вы можете использовать Wait .
C #
using (var driver = new ChromeDriver())
{
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5));
try
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
}
catch (WebDriverTimeoutException)
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10))
.Until(ExpectedConditions.ElementIsVisible
(By.XPath("//div[@class='summary']/h3/a")));
}
}
Проблема . Если вы установите слишком короткий тайм-аут, страница перестанет загружаться независимо от того, присутствует ли ваш желаемый элемент. Когда вы установите слишком высокий тайм-аут, вы откажетесь от производительности.