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



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

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

如果我让您纠正,您正在尝试存档检查元素是否显示。您可以使用普通硒和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或其他内容删除元素。良好的硒测试应始终尝试代表尽可能出色的真实用户观点。意味着,如果UI仍然表现相同,您的测试仍然应该成功。因此,您应该进行更一般的检查 - 是否显示是否显示。

这是Seleniums Webelement接口的基本功能之一,或更精确的isDisplayed()方法。

selenium java文档的报价:

boolean isDisplayed()

此元素是否显示? 此方法避免了必须 解析元素的"样式"属性。 返回: 是否显示该元素

此外,我建议为类似的事情编写一些小型助手方法,根据我的经验,这是一种常见的用例,您会经常面对。例如,助手方法可以看起来像这样:

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

如果您使用的是一些硒抽象,例如氟苯甲酸或硒化的事情,事情将变得更加方便,因为它们为众所周知的断言库提供了诸如Assertj,Hamcrest,Hamcrest,Junit。

例如,使用荧光容元和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));
}

或(我建议什么)为此使用库,例如等待性

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

  • java示例带有普通硒
  • 示例使用荧光容元和许多其他有用的东西

似乎在您需要删除的XPath末尾有一个额外的 / 。此外,您需要为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");
}

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

相关内容

  • 没有找到相关文章

最新更新