【问题标题】:How to extract the display attribute of an element using Selenium Webdriver and Java如何使用 Selenium Webdriver 和 Java 提取元素的显示属性
【发布时间】:2019-03-12 04:53:59
【问题描述】:

在 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");}

【问题讨论】:

标签: java selenium selenium-webdriver display getattribute


【解决方案1】:

没有像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");
}

【讨论】:

  • 第一个:字符串值只返回“z-index: 1200; width: 640px; height: 420px;”价值。
  • @mrudulghagor 您可能需要等到元素完全加载
【解决方案2】:

如果我让您正确,您正在尝试存档检查元素是否显示。你可以使用普通的 selenium 和 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));
}

您的测试(端到端的 UI 测试!)不应拘泥于像 display:nonedisplay:block 这样的实现细节。想象一下实现将被更改为通过 javascript 或其他方式删除元素。一个好的 selenium 测试应该尽可能地代表真实用户的观点。表示如果 UI 的行为仍然相同,您的测试应该仍然成功。因此,您应该进行更一般的检查 - 是否显示元素。

这是Seleniums WebElement interface 的基本功能之一,或者更准确地说是isDisplayed() 方法。

引用 Selenium Java Docs:

布尔 isDisplayed()

这个元素是否显示? 这种方法避免了不得不 解析元素的“样式”属性。 回报: 是否显示元素

此外,我建议为此类事情编写一些小的辅助方法,根据我的经验,这是您会更经常遇到的常见用例。 例如,辅助方法可能看起来像这样:

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

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

如果您使用诸如 FluentLeniumSelenide 之类的 Selenium 抽象,事情将变得更加方便,因为它们为诸如 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 选择器不那么脆弱,它会加速您的测试并且可读性更好

你应该看看隐式等待而不是使用线程睡眠(不好的做法)。您可以再次自己实现这样的辅助方法,例如:

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

如果您正在寻找更扩展的示例,可以在这里查看:

【讨论】:

    【解决方案3】:

    的末尾似乎有一个额外的 /,您需要将其删除。此外,您需要为visibilityOfElementLocated() 诱导WebDriverWait。因此,您的代码行将是:

    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");
    }
    

    【讨论】:

    • 但是字符串值返回“null”值。
    • 我需要用javascript还是DOM来定位它?
    • @mrudulghagor 查看更新的答案并告诉我状态。
    【解决方案4】:

    Q1.我想定位显示元素,但是元素被隐藏了,我也写了代码。

    A1. 根据您的以下代码:

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

    它看起来并不隐藏,问题是您使用了不正确的 xpath 和 element 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);
    

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2018-11-03
      • 2019-09-06
      • 2017-04-27
      • 2012-12-26
      • 2019-07-23
      • 2018-10-18
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多