Как извлечь атрибут отображения элемента с помощью Selenium Webdriver и Java - PullRequest
0 голосов
/ 12 марта 2019

невозможно найти скрытый элемент в div

<div id="divDuplicateBarcodeCheck" class="spreadsheetEditGui" style="z- 

 index: 1200; width: 640px; height: 420px; top: 496.5px; left: 640px; 

display:block"> ==$0

Я хочу найти элемент отображения, но элемент скрыт, я тоже написал код для него.

String abc=d.findElement(By.xpath("//div[@id='divDuplicateBarcodeCheck']/"))
.getAttribute("display");
 System.out.println(abc);
 Thread.sleep(3000);
 if(abc.equalsIgnoreCase("block"))      
 {          
 d.findElement(By.id("duplicateBarcodeCheck")).click();   
System.out.println("duplicate barcode Close");                                              
}
else    
{    System.out.println("Barcode selected");}

Ответы [ 4 ]

1 голос
/ 12 марта 2019

Нет такого атрибута, как display. Это часть атрибута style.

Вы можете найти элемент и получить его стиль атрибута:

String style = d.findElement(By.xpath("//div[@id='divDuplicateBarcodeCheck']")).getAttribute("style");
if(style.contains("block")) {          
    d.findElement(By.id("duplicateBarcodeCheck")).click();   
    System.out.println("duplicate barcode Close");                                              
} else {   
    System.out.println("Barcode selected");}
}

ИЛИ вы можете найти этот элемент напрямую с помощью cssSelector (это также возможно с xpath):

WebElement abc = d.findElement(By.cssSelector("div[id='divDuplicateBarcodeCheck'][style*='display: block']"))

Обратите внимание, что выше будет выбрасывать NoSuchElementException, если элемент не был найден. Вы можете использовать блок try-catch для выполнения аналогичных операций, как вы это делали в if-else выражении, например:

try {
    d.findElement(By.cssSelector("div[id='divDuplicateBarcodeCheck'][style*='display: block']"));
    d.findElement(By.id("duplicateBarcodeCheck")).click();
    System.out.println("duplicate barcode Close");  
} catch (NoSuchElementException e) {
     System.out.println("Barcode selected");
}
1 голос
/ 12 марта 2019

Если я правильно понимаю, вы пытаетесь архивировать, проверяя, отображается элемент или нет.Вы можете сделать что-то подобное, используя обычный селен и java:

// the @FindBy annotation provides a lazy implementation of `findElement()` 
@FindBy(css = "#divDuplicateBarcodeCheck")
private WebElement barcode;

@Test
public void example() {
    driver.get("http://some.url");
    waitForElement(barcode);
    // isDisplay() is natively provided by type WebElement
    if (barcode.isDisplayed()) {
        // do something
    } else {
        // do something else
    }
}

private void waitForElement(final WebElement element) {
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    wait.until(ExpectedConditions.visibilityOf(element));
}

Ваш тест (сквозной тест пользовательского интерфейса!) Не должен придерживаться деталей реализации, таких как display:none или display:block.Представьте, что реализация будет изменена, чтобы удалить элемент с помощью JavaScript или чего-то еще.Хороший тест на селен должен всегда представлять реальную точку зрения пользователей как можно лучше.Означает, что пользовательский интерфейс будет продолжать работать так же, ваш тест должен пройти успешно.Поэтому вам следует выполнить более общую проверку - отображается элемент или нет.

Это одна из базовых функций интерфейса Seleniums WebElement , или, если быть более точным, его isDisplayed()method.

Цитата из Selenium Java Docs :

логический isDisplayed ()

Отображается ли этот элементили нет?Этот метод избавляет от необходимости разбора атрибута "style" элемента.Возвращает: независимо от того, отображается элемент или нет

Кроме того, я бы порекомендовал написать несколько небольших вспомогательных методов для подобных вещей, по моему опыту, это общий случай использования, с которым вы будете сталкиваться чаще.вспомогательный метод может, например, выглядеть примерно так:

boolean isElementVisible(final By by) {
    return driver.findElement(by).isDisplayed();
}

boolean isElementVisible(final WebElement element) {
    return element.isDisplayed();
}

Если вы используете абстракции Selenium, такие как FluentLenium или Selenide , все станет еще удобнее, потому что онипредоставить такие вещи, как расширения утверждений и пользовательские средства сопоставления для хорошо известных библиотек утверждений, таких как assertJ, hamcrest, junit.

Например, для FluentLenium и AssertJ (стек, который я лично могу порекомендовать), ответ на вашу проблему выглядит так же простокак это:

// check if element is displayed
assertThat(el("#divDuplicateBarcodeCheck")).isDisplayed();

// check if element is not displayed
assertThat(el("#divDuplicateBarcodeCheck")).isNotDisplayed();

Еще несколько мыслей:

Вы должны также использовать CSS-селекторы, если это возможно, вместо селекторов xPath.Селекторы CSS менее хрупкие , они ускорят ваши тесты и лучше читаются .

Вместо этого вы должны взглянуть на неявные ожиданияиспользования Thread Sleep (плохая практика).Вы можете снова реализовать вспомогательные методы, подобные этим, например:

void waitForElement(final WebElement element) {
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    wait.until(ExpectedConditions.visibilityOf(element));
}

void waitForElement(final By by) {
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    wait.until(ExpectedConditions.visibilityOfElementLocated(by));
}

void waitForElementIsInvisible(final By by) {
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    wait.until(ExpectedConditions.invisibilityOfElementLocated(by));
}

или (что я бы порекомендовал) использовать для этого библиотеку, например Awaitility

Если вы ищете более расширенный пример, вы можете посмотреть здесь:

0 голосов
/ 13 марта 2019

Q1. Я хочу найти элемент дисплея, но элемент скрыт, я тоже написал для него код.

A1. В соответствии с кодом ниже:

<div id="divDuplicateBarcodeCheck" class="spreadsheetEditGui" style="z- 
    
     index: 1200; width: 640px; height: 420px; top: 496.5px; left: 640px; 
    
    display:block"> ==$0

Это не выглядит скрытым, проблема в том, что вы используете неверный xpath и элемент getter.

Использование:

String abc = d.findElement(By.xpath("//div[@id='divDuplicateBarcodeCheck']"))
.getCssValue("display");

Вместо:

 => .getAttribute("display");

Альтернативный метод с использованием JavascriptExecutor:

JavascriptExecutor jse = (JavascriptExecutor) d;
String displayProperty = (String) jse.executeScript("return 
document.getElementById('divDuplicateBarcodeCheck').style.display");
System.out.println("Display property is: "+displayProperty);
0 голосов
/ 12 марта 2019

Кажется, что есть дополнительный / в конце , который необходимо удалить.Кроме того, вам нужно вызвать WebDriverWait для visibilityOfElementLocated().Таким образом, ваша строка кода будет иметь следующий вид:

String abc = new WebDriverWait(d, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//label[contains(.,'Leave Balance')]//following::div[@id='applyleave_leaveBalance']"))).getAttribute("style");
System.out.println(abc);
if(abc.contains("block"))
{          
    d.findElement(By.id("duplicateBarcodeCheck")).click();   
    System.out.println("duplicate barcode Close");                                              
}
else    
{    
    System.out.println("Barcode selected");
}

Фактически, блок if() все еще является служебной информацией, и вы можете достичь того же с помощью:

try {
    new WebDriverWait(d, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//label[contains(.,'Leave Balance')]//following::div[@id='applyleave_leaveBalance']"))).click();
    System.out.println("duplicate barcode Close");  
} catch (NoSuchElementException e) {
     System.out.println("Barcode selected");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...