为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Selenium Webdriver和Java提取元素的显示属性

如何使用Selenium Webdriver和Java提取元素的显示属性

慕码人2483693 2022-08-03 16:14:58
无法在 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 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

如果我让你正确,你正在尝试存档检查元素是否显示。你可以使用普通的硒和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 测试!)不应坚持使用或 之类的实现细节。想象一下,实现将被更改以通过javascript或其他方式删除元素。一个好的硒测试应该总是尝试尽可能好地代表一个真实的用户观点。意味着如果 UI 的行为仍然相同,则测试仍应成功。因此,您应该进行更一般的检查 - 是否显示元素。display:nonedisplay:block


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


引用自Selenium Java Docs:


布尔值 isDisplayed()


是否显示此元素?此方法避免了必须分析元素的“style”属性的问题。返回:是否显示元素


此外,我建议为这样的事情编写一些小的帮助器方法,根据我的经验,这是一个常见的用例,你会更频繁地面对。例如,帮助器方法可能如下所示:


boolean isElementVisible(final By by) {

    return driver.findElement(by).isDisplayed();

}


boolean isElementVisible(final WebElement element) {

    return element.isDisplayed();

}

如果你正在使用一些硒抽象,如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选择器不那么脆弱,它将加快测试速度并且可读性更好。


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


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

}

或者(我建议)为此使用一个库,例如Waitility


查看完整回答
反对 回复 2022-08-03
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

没有 这样的属性。它是属性的一部分。displaystyle


您可以找到该元素并获取其属性样式:


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

}

或者你可以直接找到这个元素(也可以使用xpath):cssSelector


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

请注意,如果未找到该元素,则上述内容将抛出。您可以使用 block 执行类似的操作,就像在语句中所做的那样,如下所示:NoSuchElementExceptiontry-catchif-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");

}


查看完整回答
反对 回复 2022-08-03
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

似乎有一个额外的/在末尾xpath您需要将其删除。此外,您需要诱导 WebDriverWait for .因此,实际上您的代码行将是: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");

}


查看完整回答
反对 回复 2022-08-03
?
繁花如伊

TA贡献2012条经验 获得超12个赞

问题 1.我想找到显示元素,但元素是隐藏的,我也为它编写了代码。


解答 1.按照您的以下代码:


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

    

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

    

    display:block"> ==$0


它看起来并不隐藏,问题是你使用了不正确的xpath和元素获取器。


用:


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


查看完整回答
反对 回复 2022-08-03
  • 4 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号