Selenium WebDriver-проверить наличие элемента
есть ли способ проверить, если элемент присутствует? Любой метод findElement закончится исключением, но это не то, что я хочу, потому что может быть, что элемент отсутствует, и это нормально, это не сбой теста, поэтому исключение не может быть решением.
Я нашел этот пост: Selenium C# Webdriver: подождите, пока элемент присутствует Но это для C# и я не очень хорош в этом. Может ли кто-нибудь перевести код на Java? Мне жаль, ребята, Я пробовал это в Eclipse, но я не получаю его прямо в Java-код.
этот код:
public static class WebDriverExtensions{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){
if (timeoutInSeconds > 0){
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
}
20 ответов
использовать findElements
вместо findElement
.
findElements
вернет пустой список, если вместо исключения не найдено совпадающих элементов.
чтобы проверить, что элемент присутствует, вы можете попробовать это
Boolean isPresent = driver.findElements(By.yourLocator).size() > 0
это вернет true, если хотя бы один элемент найден и false, если он не существует.
Как насчет частного метода, который просто ищет элемент и определяет, присутствует ли он так:
private boolean existsElement(String id) {
try {
driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
return false;
}
return true;
}
Это было бы довольно легко и делает работу.
Edit: вы даже можете пойти дальше и взять By elementLocator
как параметр, устраняющий проблемы, если вы хотите найти элемент чем-то другим, кроме id.
Я обнаружил, что это работает для Java:
WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);
public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds)
{
WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds
return driver.findElement(by);
}
у меня была та же проблема. Для меня, в зависимости от уровня разрешений пользователя, некоторые ссылки, кнопки и другие элементы не будут отображаться на странице. Часть моего набора проверяла, что элементы, которые должны отсутствовать, отсутствуют. Я потратил часы, пытаясь понять это. Наконец-то я нашел идеальное решение.
что это делает, это говорит браузеру искать любые и все элементы на основе указанных. Если это приведет к 0
, это означает, что никакие элементы на основе спецификации не были найдено. Затем я должен выполнить оператор if, чтобы сообщить мне, что он не найден.
это C#
, поэтому переводы должны быть сделаны в Java
. Но это не должно быть слишком сложно.
public void verifyPermission(string link)
{
IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link));
if (adminPermissions.Count == 0)
{
Console.WriteLine("User's permission properly hidden");
}
}
есть также другой путь, который вы можете принять в зависимости от того, что вам нужно для вашего теста.
следующий фрагмент проверяет, существует ли на странице очень конкретный элемент. В зависимости от существования элемента у меня есть тест, который выполняет if else.
, если элемент существует и отображается на странице, у меня есть console.write
дайте мне знать, и двигаться дальше. Если элемент, о котором идет речь, существует, я не могу выполнить тест, который мне нужен, что является основным аргументом в пользу необходимости его настройки.
если элемент не существует, и не отображается на странице. У меня есть еще в if else выполнить тест.
IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE"));
//if the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute whats in the else statement
if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){
//script to execute if element is found
} else {
//Test script goes here.
}
Я знаю, что немного опоздал с ответом на операцию. Надеюсь, это кому-то поможет!
попробуйте это: Вызовите этот метод и передайте 3 аргумента:
- переменная WebDriver. / исходя из того, что driver_variable в качестве водителя.
- элемент, который вы собираетесь проверить. Следует обеспечить от методом. // пример: By.id ("id")
- ограничение по времени в секундах.
пример: waitForElementPresent (драйвер, By.id ("id"), 10);
public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) {
WebElement element;
try{
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait()
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
element = wait.until(ExpectedConditions.presenceOfElementLocated(by));
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait
return element; //return the element
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
вы можете заставить код работать быстрее, закоротив тайм-аут selenium перед операцией try catch.
Я использую следующий код, чтобы проверить, если элемент присутствует.
protected boolean isElementPresent(By selector) {
selenium.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
logger.debug("Is element present"+selector);
boolean returnVal = true;
try{
selenium.findElement(selector);
} catch (NoSuchElementException e){
returnVal = false;
} finally {
selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
}
return returnVal;
}
напишите следующую функцию / methos с помощью Java:
protected boolean isElementPresent(By by){
try{
driver.findElement(by);
return true;
}
catch(NoSuchElementException e){
return false;
}
}
вызовите метод с соответствующим параметром во время утверждения.
Если вы используете rspec-Webdriver в ruby, вы можете использовать этот скрипт, предполагая, что элемент действительно не должен присутствовать, и это пройденный тест.
во-первых, сначала напишите этот метод из файла класса RB
class Test
def element_present?
begin
browser.find_element(:name, "this_element_id".displayed?
rescue Selenium::WebDriver::Error::NoSuchElementError
puts "this element should not be present"
end
end
затем в файле спецификации вызовите этот метод.
before(:all) do
@Test= Test.new(@browser)
end
@Test.element_present?.should == nil
Если ваш элемент отсутствует, ваша спецификация пройдет, но если элемент присутствует, он выдаст ошибку, тест не удался.
это работает для меня:
if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
//THEN CLICK ON THE SUBMIT BUTTON
}else{
//DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}
чтобы найти конкретный элемент присутствует или нет, мы должны использовать метод findElements() вместо findElement()..
int i=driver.findElements(By.xpath(".......")).size();
if(i=0)
System.out.println("Element is not present");
else
System.out.println("Element is present");
это работает для меня.. предложите мне, если я ошибаюсь..
Это должно сделать это:
try {
driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
//do what you need here if you were expecting
//the element wouldn't exist
}
вы можете попробовать неявное ожидание:'
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));
`
или вы можете попробовать явное ожидание одного:'
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.Id("someDynamicElement"));
});
`
Explicit проверит, присутствует ли элемент перед некоторым действием. Неявное ожидание может быть вызовом в каждом месте кода. Например, после некоторых действий AJAX.
больше вы можете найти на странице SeleniumHQ:http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
предоставление моего фрагмента кода. Таким образом, метод ниже проверяет, является ли случайный веб-элемент 'Создать Новое Приложение на странице или нет. Обратите внимание, что я использовал период ожидания как 0 секунд.
public boolean isCreateNewApplicationButtonVisible(){
WebDriverWait zeroWait = new WebDriverWait(driver, 0);
ExpectedCondition<WebElement> c = ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@value='Create New Application']"));
try {
zeroWait.until(c);
logger.debug("Create New Application button is visible");
return true;
} catch (TimeoutException e) {
logger.debug("Create New Application button is not visible");
return false;
}
}
Я бы использовал что-то вроде (с Scala [код в старой "хорошей" Java 8 может быть похож на это]):
object SeleniumFacade {
def getElement(bySelector: By, maybeParent: Option[WebElement] = None, withIndex: Int = 0)(implicit driver: RemoteWebDriver): Option[WebElement] = {
val elements = maybeParent match {
case Some(parent) => parent.findElements(bySelector).asScala
case None => driver.findElements(bySelector).asScala
}
if (elements.nonEmpty) {
Try { Some(elements(withIndex)) } getOrElse None
} else None
}
...
}
Итак,
val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement))
самый простой способ, который я нашел в Java:
List<WebElement> linkSearch= driver.findElements(By.id("linkTag"));
int checkLink=linkSearch.size();
if(checkLink!=0){ //do something you want}
public boolean isElementFound( String text) {
try{
WebElement webElement = appiumDriver.findElement(By.xpath(text));
System.out.println("isElementFound : true :"+text + "true");
}catch(NoSuchElementException e){
System.out.println("isElementFound : false :"+text);
return false;
}
return true;
}
Ниже приведены способы проверить, если веб-элемент isPresent или не :
я использовал XPath-выражения как элемент Идентификатор/Локатор, но вы можете использовать и другие локаторы.
Решение I:
public boolean isElementPresent(String xpathOfElement){
try{
driver.findElement(By.xpath(xpathOfElement));
return true;
}
catch(NoSuchElementException e){
return false;
}
}
решение II:
public boolean isElementPresent(String xpathOfElement){
boolean isPresent = false;
if(!driver.findElements(By.xpath(xpathOfElement)).isEmpty()){
isPresent=true;
}
return isPresent;
}
решение III :
public boolean isElementPresent(String xpathOfElement){
return driver.findElements(By.xpath(xpathOfElement)).size() > 0;
}
лично я всегда иду на смесь вышеуказанных ответов и создаю повторно используемый метод статической утилиты, который использует предложение size ()
public Class Utility {
...
public static boolean isElementExist(WebDriver driver, By by) {
return driver.findElements(by).size() < 0;
...
}
это аккуратно, повторно использовать, ремонтопригодно ... все эти хорошие вещи; -)