- Какой правильный способ проверить, присутствует ли элемент или отображается на странице с Selenium WebDriver с использованием Java?
- Как проверить наличие или видимость элемента в селене 2 (Selenium WebDriver)
- 8 ответов
- Ещё вопросы
- Как проверить видимость элемента, который может присутствовать или не присутствовать?
Какой правильный способ проверить, присутствует ли элемент или отображается на странице с Selenium WebDriver с использованием Java?
Я тестирую веб-приложение с помощью Selenium WebDriver, и мне было интересно, какой из них является правильным методом проверки присутствия или отображения элементов. Обычно я утверждаю, что все элементы присутствуют на странице, но также проверяет скрытые элементы, которые в этом случае также необходимы, чтобы проверить, отображаются ли элементы только тогда, когда выполняется какое-либо действие. Например, я нажимаю ссылку, а другие поля и метки отображаются, пока они были скрыты раньше. В этом случае я должен проверить, присутствуют ли элементы, а также, если они отображаются или не отображаются до и после нажатия какого-либо другого элемента. Мне было интересно, что это правильный способ сделать это. Это слишком много, чтобы проверить все элементы на странице (предполагая, что на странице есть несколько кнопок, текстовые поля, метки, ссылки и т.д.)? В целях обсуждения я хочу включить некоторые фрагменты кода. Чтобы проверить, что элементы присутствуют на странице, я использую следующий фрагмент:
public boolean isElementPresent(By by) < try < driver.findElement(by); return true; >catch (NoSuchElementException e) < return false; >>
public boolean isElementDisplay(By by) < if (driver.findElement(by).isDisplayed()) < return true; >else return false; >
Одна из целей тестирования этого приложения — проверить, существуют ли элементы и отображаются ли они правильно. Правильно ли я здесь делаю? Пожалуйста, дайте мне вашу точку зрения. Недавно я начал работать с Selenium WebDriver и был единственным в моей компании, который это делает. Мне не к кому обратиться. Любой ответ приветствуем.
Как проверить наличие или видимость элемента в селене 2 (Selenium WebDriver)
Что вы пробовали? Вы читали какие-нибудь учебники? На каком языке? C #? Джава? PHP? Свинья латинская?
Я хочу попробовать это на языке Java. Пожалуйста, пришлите мне учебники или справочный документ для селена веб-драйвера. Я буду благодарен вам. Помогите мне, пожалуйста
8 ответов
Я использовал операторы печати java для легкого понимания.
- Чтобы проверить присутствующий элемент:
if(driver.findElements(By.xpath("value")).size() != 0)< System.out.println("Element is Present"); >else
if(driver.findElement(By.xpath("value"))!= null)< System.out.println("Element is Present"); >else
if( driver.findElement(By.cssSelector("a > font")).isDisplayed())< System.out.println("Element is Visible"); >else
if( driver.findElement(By.cssSelector("a > font")).isEnabled())< System.out.println("Element is Enable"); >else
if(driver.getPageSource().contains("Text to check"))< System.out.println("Text is present"); >else
if (driver.findElement (By.cssSelector («a> font»)). isDisplayed ())
Вы можете попробовать что-то вроде:
WebElement rxBtn = driver.findElement(By.className("icon-rx")); WebElement otcBtn = driver.findElement(By.className("icon-otc")); WebElement herbBtn = driver.findElement(By.className("icon-herb")); Assert.assertEquals(true, rxBtn.isDisplayed()); Assert.assertEquals(true, otcBtn.isDisplayed()); Assert.assertEquals(true, herbBtn.isDisplayed());
Это просто пример. В основном вы объявляете и определяете переменные WebElement, которые хотите использовать, а затем Assert , отображаются ли они. Это использует TestNG Assertions.
Я пробую приведенный выше пример, но это не выполнение следующих шагов, если предыдущее утверждение не удалось. Я хочу использовать подтверждение вместо утверждения, чтобы он мог выполнить следующие шаги теста. И я также делаю, чтобы провалить весь тестовый случай, если любое из утверждений и верфикатинов не удалось
Итак, из вашего ответа я понял, что вы хотели бы, чтобы тест продолжался, даже если утверждение не выполнено. Это верно?
да, я хочу именно то, что вы написали. я хочу, чтобы тест продолжался, даже если утверждение теста не выполнено, и в последнем случае после выполнения всех шагов теста отметьте результат теста как ошибку в отчете. Но это должно завершить все шаги выполнения.
В зависимости от того, как вы выполняете свои тесты, единственная опция, которую я мог найти в документации TestNG, это -configurefailpolicy для параметров командной строки. testng.org/doc/documentation-main.html
WebElement rxBtn = driver.findElement (By.className («icon-rx»)); Assert.assertEquals (true, rxBtn.isDisplayed ()); Я думаю, что нет смысла писать 2-ю строку после первой строки, так как, если элемент отсутствует, findElement выдает исключение NoSuchElementException, тем самым завершая выполнение программы в этой строке. assertEquals () не будет запущен.
Вот мой код Java для Selenium WebDriver. Напишите следующий метод и вызовите его во время утверждения:
protected boolean isElementPresent(By by) < try< driver.findElement(by); return true; >catch(NoSuchElementException e) < return false; >>
Попробуйте использовать нижеприведенный код:
private enum ElementStatus < VISIBLE, NOTVISIBLE, ENABLED, NOTENABLED, PRESENT, NOTPRESENT >private ElementStatus isElementVisible(WebDriver driver, By by,ElementStatus getStatus) < try< if(getStatus.equals(ElementStatus.ENABLED))< if(driver.findElement(by).isEnabled()) return ElementStatus.ENABLED; return ElementStatus.NOTENABLED; >if(getStatus.equals(ElementStatus.VISIBLE)) < if(driver.findElement(by).isDisplayed()) return ElementStatus.VISIBLE; return ElementStatus.NOTVISIBLE; >return ElementStatus.PRESENT; >catch(org.openqa.selenium.NoSuchElementException nse) < return ElementStatus.NOTPRESENT; >>
webDriver.findElement(By.xpath( «//* [@ид = ‘элемент’]»)) isDisplayed().
Чтобы убедиться, что элемент присутствует, вы можете сделать следующее:
Это вернет массив, если этот размер массива равен > 0, тогда присутствует элемент /s.
Кроме того, вам нужно предоставить дополнительную информацию, такую как язык и то, что вы пробовали, прежде чем спрашивать,
driver.findelement (By.id («id1»)). isDisplayed () ‘driver.findelement (By.id («id2»)). sendkey («test»); Здесь, если элемент не отображается, он не проходит тестовый пример и не переходит к следующему шагу для выполнения. Поэтому, пожалуйста, помогите мне, как обработать утверждение и продолжить выполнение теста для следующих шагов в Selen Webdrier и Testng. Даже я также хочу пометить тестовый случай провал, если кто-либо утверждение не удалось.
id уникален, вы должны использовать .findElement () для него. .findElements () для например. By.ClassName ()
Для видимой проверки вы можете использовать метод .isDisplayed().
Чтобы проверить, является ли элемент видимым, нам нужно использовать element.isDisplayed(); Но если нам нужно проверить присутствие элемента в любом месте Dom, мы можем использовать следующий метод
public boolean isElementPresentCheckUsingJavaScriptExecutor(WebElement element) < JavascriptExecutor jse=(JavascriptExecutor) driver; try < Object obj = jse.execute("return typeof(arguments[0]) != 'undefined' && arguments[0] != null;", element); if (obj.toString().contains("true")) < System.out.println("isElementPresentCheckUsingJavaScriptExecutor: SUCCESS"); return true; >else < System.out.println("isElementPresentCheckUsingJavaScriptExecutor: FAIL"); >> catch (NoSuchElementException e) < System.out.println("isElementPresentCheckUsingJavaScriptExecutor: FAIL"); >return false; >
Ещё вопросы
- 1 Как установить свойство Valuse элемента списка, чтобы исправить идентификатор из строки таблицы базы данных?
- 0 Независимые куки в разных папках
- 0 Объединение угловых сервисов с модулями NodeJS
- 1 Как я могу получить доступ к объекту, связанному с LiveData, вне наблюдателя?
- 0 Неожиданное поведение PHP-функции rename (), используемой в моем коде для переименования файлов
- 0 Странный вывод из exec ()
- 0 Как заполнить вектор списков?
- 1 Как преобразовать процесс в Node.js для запуска кода JS из буфера, доступного в parent, а не из файла?
- 1 вычислить определитель матрицы
- 0 MySQL выбирает одно значение из таблицы, если есть два языка [дубликата]
- 1 UUID генерируется с использованием двух языков программирования?
- 0 Сайт AngularJS — полный или частичный
- 0 использование ng-route в angular для маршрутизации в разные htmls с использованием параметра routeconfig
- 0 SQL-запрос принимает январь месяц как 13 вместо 01
- 0 Как получить доступ к области действия ng-repeat из другой директивы того же элемента, на котором включен ng-repeat?
- 0 УЧАР * в std :: string
- 0 Mysql создать представление, связывающее две таблицы
- 1 Обрабатывать всплывающее окно JavaScript внутри div
- 0 Удержание вектора уникального значения, установленного для выбора цвета с использованием C ++ и OpenGL
- 1 Вывести toString () из отдельных классов
- 1 Структурированный массив Numpy не выполняет основные операции с NumPy
- 1 включить поддержку Java8 в Eclipse?
- 0 Получение Visual Studio, чтобы увидеть мое пространство имен
- 0 Почему переполнение вывода std :: cout?
- 0 LinkedStack и его шаблонный класс
- 1 Угловая труба: невозможно заменить / n
- 1 Получить все несжатые байты из сжатого файла
- 0 указать порядок полей в сообщении FIX, используя QuickFIX
- 1 Куда вставить JScrollPane?
- 0 fnfilter проблема поиска в datatables
- 1 Добавление текста в FarPoint при экспорте в Excel
- 0 угловая ошибка выпадающего загрузчика: d.init не является функцией
- 1 Избегайте утечки памяти в клиенте c # неуправляемой DLL с утечкой памяти
- 1 Удаление одинаковых выбросов в двух временных сериях
- 0 использование PHP регулярных выражений для удаления атрибутов из элементов HTML-тегов
- 0 Почему драйвер Mongo C ++ дает мне ошибки компиляции?
- 0 1066 — Не уникальный стол / псевдоним: «художники»
- 1 python — замена фрагмента из строки [duplicate]
- 0 Могу ли я объединить эти вызовы g ++ в один?
- 0 Мой текст вращается, но фоновое изображение не
- 1 Как исправить ошибку java.lang.VerifyError?
- 0 Ошибка с вызовом oleacc.dll — ошибка доступа запрещена 80020009
- 0 меню немного расширяется вправо
- 0 MySQL поиск дубликатов имен файлов с разными расширениями
- 1 Array picturebox событие click в c #
- 0 Как поместить в текст внутри
в html + css?
- 1 python joblib & random walk — выполнение планирования [CONCURRENT] -процесса
- 1 Crashlytics сообщает в Fabric, но в Firebase Crashlytics нет никаких следов
- 1 API-интерфейс SMS-ретривера: SMSBroadcastReceiver не распознает полученное сообщение.
- 0 Jquery не срабатывает, если оператор для определенных значений
Как проверить видимость элемента, который может присутствовать или не присутствовать?
Рассмотрите этот URL: https://sfbay.craigslist.org/pen/apa/5759740929.html Когда вы нажмете кнопку ответа, вы увидите всплывающее окно div с вариантами ответа. Див может иметь или не иметь номера телефонов и имя контактного лица.
Я сделал некоторый код для этого, и я ожидаю работать, как указано в пунктах ниже.
1- Если нажата кнопка ответа, дождитесь появления всплывающего окна параметров ответа. Когда всплывающее окно будет видно, ищите любые номера телефонов и извлекайте их.
2- Если во всплывающем окне нет номеров, ничего не делайте (это потому, что человек не хочет делиться своим номером телефона).
3- Если кто-то пытается извлечь телефонные номера / имена, когда всплывающее окно не открыто, то выдается исключение времени выполнения, в котором говорится, что кнопка ответа не нажата.
Почему код не работает, когда я использую wait_for_reply_options_popup_to_be_visible(), но проходит, когда я использую это: wait_for_calling_options_to_be_visible();
Пожалуйста, помогите мне понять, почему и решить эту проблему. Спасибо!
import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.util.List; import static Utils.extract_phone_numbers; public class Temp < private static final WebDriver browser = new ChromeDriver(); private static String url = "https://sfbay.craigslist.org/pen/apa/5759740929.html"; private WebElement reply_btn; private String reply_btn_xpath = "//button[contains(concat(\" \", normalize-space(@class), \" \"), \" " + "reply_button" + " \")]"; private By reply_btn_loc = By.xpath(reply_btn_xpath); private String reply_options_xpath = "//button[contains(concat(\" \", normalize-space(@class), \" \"), \" " + "reply_options" + " \")]"; private By reply_options_loc = By.xpath(reply_options_xpath); private String call_options_xpath = "//b[contains(text(), 'call') or contains(text(), 'text')]"; private By call_options_loc = By.xpath(call_options_xpath); public String phone_xpath = "following-sibling::ul/li"; public By phone_loc = By.xpath(phone_xpath); @Before public void before_each_test() < browser.get(url); load_elements(); >@Test public void get_phone_number() throws Exception < reply_btn.click(); Listphones = get_calling_or_texting_options(); System.out.println(phones); > private void load_elements() < reply_btn = new WebDriverWait(browser, 5).until( ExpectedConditions.presenceOfElementLocated(reply_btn_loc)); >private void wait_for_calling_options_to_be_visible() < new WebDriverWait(browser, 5).until(ExpectedConditions.visibilityOfElementLocated(call_options_loc)); >private void wait_for_reply_options_popup_to_be_visible() < new WebDriverWait(browser, 5).until(ExpectedConditions.visibilityOfElementLocated(reply_options_loc)); >private List get_calling_or_texting_options() < wait_for_reply_options_popup_to_be_visible(); //wait_for_calling_options_to_be_visible(); //Look for any element which contains call or text. Their sibling elements should have a number. Listcalling_options = browser.findElements(call_options_loc); WebElement calling_option = calling_options.get(0); if (calling_options.size() > 0) < //Get the sibling elements which contain phone numbers. WebElement phone_info = calling_option.findElement(phone_loc); //Remove all the extra text and extract only the phone number. Listphones = extract_phone_numbers(phone_info.getText()); return phones; > else < String error = "Cannot get list of contact numbers! Please click the reply button first!"; throw new RuntimeException(error); >> >
Трассировки стека:
org.openqa.selenium.TimeoutException: Timed out after 5 seconds waiting for visibility of element located by By.xpath: //button[contains(concat(" ", normalize-space(@class), " "), " reply_options ")]. at org.openqa.selenium.support.ui.WebDriverWait.timeoutException(WebDriverWait.java:80) at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:261) at src.Temp.wait_for_reply_options_popup_to_be_visible(Temp.java:59) at src.Temp.get_calling_or_texting_options(Temp.java:63) at src.Temp.get_phone_number(Temp.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) . Caused by: org.openqa.selenium.NoSuchElementException: no such element (Session info: chrome=52.0.2743.116) (Driver info: chromedriver=2.9.248315,platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 9 milliseconds For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html. . *** Element info: at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206) .