检查一个元素没有';在selenium/java中应用过滤器后不存在
我必须验证结果是否与我应用的过滤器匹配 我选择的过滤器是“打开”的,并确保结果(这是一个列表)只包含“打开” 我曾想过使用文本“Open”的xpath,但每个显示结果的xpath都会发生如下变化:检查一个元素没有';在selenium/java中应用过滤器后不存在,java,selenium,automation,Java,Selenium,Automation,我必须验证结果是否与我应用的过滤器匹配 我选择的过滤器是“打开”的,并确保结果(这是一个列表)只包含“打开” 我曾想过使用文本“Open”的xpath,但每个显示结果的xpath都会发生如下变化: 1st result - (//SPAN[@class='ng-binding'][text()='OPEN'][text()='OPEN'])[1] 2nd result - (//SPAN[@class='ng-binding'][text()='OPEN'][text()='OPEN'])[2
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:
<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> </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>
发行号
6530
描述
自动化测试
添加的照片
()
地位
日期
1/0
隐藏缩略图
显示缩略图
OPEN6530自动测试
是否有更好的方法来断言只显示“打开”结果?顺便说一句,结果中有一个滚动条。这里您选择的是打开文本的元素。因此,有可能存在具有不同状态的项目 有两种方法可以很好地测试过滤器 检查每个项目的状态:选择“所有”元素并检查状态文本是否等于“打开”,如下所示
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");
}
List lstItems=driver.findElements(By.xpath(“//div[@class='issue-status-group']/div/span[class='ng-binding']);
for(WebElement eleItem:lstItems){
Assert.assertEquals(eleItem.getText(),“OPEN”);
}
检查计数:第二种方法是,找到打开文本的所有元素并检查其计数
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.
List lstItems=driver.findElements(By.xpath(//span[class='ng-binding'和text()='OPEN']);
Assert.assertEquals(lstItems.size(),10)//假定此处没有10个打开的项。
您可以使用java 8 streams API过滤打开状态:
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");
}
在这里,它检查是否存在任何不包含状态“OPEN”的WebElement,如果存在,则返回“true”,否则返回“false”。
此外,您不必每次都计算将显示的结果数。
它将根据任何给定的文本过滤列表
我希望它也能简化答案。考虑到为开放结果提供的HTML。请找到下面的代码和解释 首先将所有结果元素存储在列表中:
List<WebElement> statusFilterResult = driver.findElementsByXPath("//div[@class='issue-status-group']//div[@class='status-icon']/..//span");
请您提供HTML源代码,以便我们可以帮助您。我正在尝试下面提到的所有方法并发布我的观察结果。您正在查找文本打开的元素,并检查文本是否打开。这总是正确的。嗨,Murthi,如果你仔细查看我在实际比较之前添加的代码行“!”即“not condition”,如果每个元素都包含“OPEN”,它将返回false,我想你现在明白了。不,你的xpath选择的元素只有OPEN文本。您如何期望文本是其他打开的呢?“打开”缺陷div是:OPEN,根据这一点,给出的xpath是正确的。您可以打印使用此选项的元素的内部文本,并可以找到显示的其他状态。如果选择了“打开”以外的其他过滤器,则只会影响结果,否则不会影响结果。如果这对你没有帮助,我们可以讨论这个问题。嘲笑我sandpdangi13@gmail.comIget
无法解析符号WebElements
错误。知道为什么吗?应该是web元素列表而不是web元素。更新了答案。请检查。即使我将预期的“PEN”改为“OPEN”,测试仍将通过,但如果我将“//div[@class='issue-status-group']///span”
用作xpath,则测试可以正常工作。这是否正确?如果在代码运行时尝试添加更多筛选器(而不是OPEN),则失败,这是正确的,但错误消息是“//div[@class='issue-status-group']///span”
,而不是实际的和预期的。如何使其以实际/预期格式显示?
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;
}
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");
}