首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在selenium/java中应用筛选器后,检查元素不存在

在selenium/java中应用筛选器后,检查元素不存在
EN

Stack Overflow用户
提问于 2018-06-18 09:34:01
回答 3查看 1.8K关注 0票数 0

我必须验证它与我应用的过滤器匹配的结果。

我选择的过滤器是" Open“,并确保结果(这是一个列表)只包含Open。

我想使用文本"Open“的xpath,但是每个显示结果的xpath都会发生如下变化:

代码语言:javascript
复制
1st result - (//SPAN[@class='ng-binding'][text()='OPEN'][text()='OPEN'])[1]

2nd result - (//SPAN[@class='ng-binding'][text()='OPEN'][text()='OPEN'])[2]

3rd result - (//SPAN[@class='ng-binding'][text()='OPEN'][text()='OPEN'])[3]

and so on...

这就是它的样子:

第一次公开结果的HTML:

代码语言:javascript
复制
<div class="issues-list-item clearfix"><div class="issue-thumbnail"><div class="thumbnail-img gallery ng-isolate-scope" ng-gallery="" images="IssuesListItemCtrl.issue.attachments" thumbs-num="11" description="IssuesListItemCtrl.issue.description" issuenum="IssuesListItemCtrl.issue.issueNumber"><!-- ngIf: image.thumb -->
<div class="ng-overlay ng-hide" ng-show="opened">
</div>
<div class="ng-gallery-content ng-hide" unselectable="on" ng-show="opened" ng-swipe-left="nextImage()" ng-swipe-right="prevImage()">
    <div class="uil-ring-css ng-hide" ng-show="loading"><div></div></div>
    <div class="header-section">
        <div class="header-text">
            <span class="heading issue-num-heading">
                <div class="header-title ng-binding">Issue no</div>
                <div class="header-content ng-binding">6530</div>
            </span>
            <span class="heading desc-heading">
                <div class="header-title ng-binding">Description</div>
                <div class="header-content ng-binding">Automation Test</div>
            </span>
            <span class="heading photo-added-heading">
                <div class="header-title ng-binding">Photos added by</div>
                <div class="header-content ng-binding"> ()</div>
            </span>
            <span class="heading status-heading">
                <div class="header-title ng-binding">Status</div>
                <div class="status-icon" id="statsIcon"></div>
                <div class="header-content ng-binding"></div>
            </span>
            <span class="heading date-heading">
                <div class="header-title ng-binding">Date</div>
                <div class="header-content ng-binding"></div>
            </span>
            <span class="close-heading" title="Close">
                <div class="close-btn" ng-click="closeGallery()"></div>
            </span>
        </div>
    </div>
    <a href="" target="_blank" ng-show="showImageDownloadButton()" class="download-image ng-hide"><i class="fa fa-download"></i></a>
    <a class="close-popup" ng-click="closeGallery()"><i class="fa fa-close"></i></a>
    <div class="nav-left previous-btn" title="Previous photo" ng-click="prevImage()"></div>
    <div class="current-image" ng-click="nextImage()" ng-show="!loading" ng-mousemove="showZoomControls($event)">
        <!-- hack to save the image -->
        <img class="current-image-save">
    </div>
    <div class="nav-right next-btn" title="Next photo" ng-click="nextImage()"></div>
    <span id="zoom-image" ng-mouseover="alwaysShowZoomControls()">
        <div>
            <!-- ngIf: !imageZoomed --><span class="zoom-out-grey ng-scope" ng-if="!imageZoomed"></span><!-- end ngIf: !imageZoomed -->
            <!-- ngIf: imageZoomed -->
            <span class="zoom-in" title="Zoom in" ng-click="zoomIn()"></span>
        </div>
    </span>
    <span class="info-text">
        <div><span class="photo-count ng-binding">1/0</span></div>
    </span>
    <div class="thumb-right-btn" ng-show="showThumbnails" ng-click="scrollRight(200)"></div>
    <div class="ng-thumbnails-wrapper">
        <div class="thumbnail-hide-icon" ng-show="showThumbnails" ng-click="hideThumbnailList()"></div>
        <div class="thumbnail-hide-header ng-binding" ng-click="hideThumbnailList()" ng-show="showThumbnails">
            Hide Thumbnails
        </div>
        <div class="thumbnail-show-icon ng-hide" ng-show="!showThumbnails" ng-click="showThumbnailList()"></div>
        <div class="thumbnail-show-header ng-binding ng-hide" ng-click="showThumbnailList()" ng-show="!showThumbnails">
            Show Thumbnails
        </div>
        <div class="ng-thumbnails slide-left" ng-show="showThumbnails">
            <!-- ngRepeat: i in images -->
        </div>
    </div>
    <div class="thumb-left-btn" ng-show="showThumbnails" ng-click="scrollLeft(200)"></div>
</div></div><!-- ngIf: IssuesListItemCtrl.issue.attachments.length === 0 --><div class="ng-thumb no-thumbnail ng-scope" ng-if="IssuesListItemCtrl.issue.attachments.length === 0"></div><!-- end ngIf: IssuesListItemCtrl.issue.attachments.length === 0 --></div><div class="issue-status-group"><div class="issue-status open" ng-class="IssuesListItemCtrl.issue.status | lowercase"><div class="status-icon"></div><span class="ng-binding">OPEN</span></div></div><div class="content"><div class="issue-number-n-type line"><span class="issue-number ng-binding">6530</span><span>&nbsp;</span><span class="issue-type ng-binding">DEFECT</span></div><div class="description line"><span class="ng-binding">Automation Test</span></div><!-- ngIf: IssuesListItemCtrl.getAssignedTo() --><!-- ngIf: IssuesListItemCtrl.issue.dueDate --></div><div fm-photo-slide-show="" image-list="IssuesListItemCtrl.photoSlides" class-names="issue-list-photo-slide-show"></div></div>

是否有更好的方法来断言只显示"Open“结果?顺便说一句,结果中有一个卷轴。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-18 10:27:23

在这里,您将选择打开文本的元素。因此,有一种可能的项目具有不同的地位。

有两种方法可以很好地测试滤波器。

检查每个项目的状态:选择all元素并检查状态文本是否等于打开,如下所示。

代码语言:javascript
复制
List<WebElement> lstItems = driver.findElements(By.xpath("//div[@class='issue-status-group']/div/span [class='ng-binding']"));
for(WebElement eleItem: lstItems){
   Assert.assertEquals(eleItem.getText(),"OPEN");
 }

检查计数:第二种方法是,找到打开文本的所有元素并检查其计数。

代码语言:javascript
复制
List<WebElement> lstItems = driver.findElements(By.xpath("//span[class='ng-binding' and text()='OPEN']"));
Assert.assertEquals(lstItems.size(), 10) //assumed no of open items are 10 here.
票数 0
EN

Stack Overflow用户

发布于 2018-06-18 10:35:42

您可以使用java 8 streams API过滤打开状态:

代码语言:javascript
复制
boolean issueOtherThanOPENIsPresent = driver.findElements(By.xpath("//div[@class='issue-status-group']//span")).stream().filter(element -> !element.getAttribute("innerText").trim().equals("OPEN")).findFirst().isPresent();
    if (issueOtherThanOPENIsPresent) {
        System.out.println("There are issues present which contains status other than OPEN");
    } else {
        System.out.println("All issues contains status OPEN");
    }

在这里,它检查是否有任何不包含状态“打开”的WebElement存在,如果它存在,它将返回"true“,否则返回"false”。此外,您也不必每次计算结果的数量将出现。它将根据任何给定的文本过滤列表。

我希望它也能简化答案。

票数 1
EN

Stack Overflow用户

发布于 2018-06-18 10:50:39

考虑到为Open结果提供的HTML。请找到下面的代码和解释。

首先,将所有结果元素存储在列表中:

代码语言:javascript
复制
  List<WebElement> statusFilterResult = driver.findElementsByXPath("//div[@class='issue-status-group']//div[@class='status-icon']/..//span");

创建一个函数,该函数将验证列表中所有web元素的文本,如果结果是,打开,则返回true,否则将返回false。

代码语言:javascript
复制
private static Boolean verifyElementsInList(
        List<WebElement> statusFilterResult) {
    Boolean flag = true;
    // TODO Auto-generated method stub
    for(WebElement status: statusFilterResult){
        if(!status.getText().trim().equalsIgnoreCase("Open")){
            flag = false;
            break;
        }
    }
    return flag;
}

将下面提到的代码添加到主函数中的行后面:List statusFilterResult =

代码语言:javascript
复制
 Boolean result = verifyElementsInList(statusFilterResult);
      if(result){
          System.out.println("The status type is Open for all the issues on the page");
      }else{
          System.out.println("The status other than open is present on the page");
      }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50906477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档