来自 WebElements 列表的相对 Xpath
[英] Relative Xpath from list of WebElements
本文介绍了来自 WebElements 列表的相对 Xpath的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在我收集了 WebElements 列表后,是否可以使用相对 xpath?如果是这样,最好的方法是什么?
这就是我所拥有的:
List 行 = driver.findElements(By.xpath(rowsXpath));int j = 1;boolean foundCollector = false;for(WebElement e:行){String c = e.findElement(By.xpath("(//tbody)[" + j + "]//u[text()=\"" + collector + "\"])")).getText();if(c.equals(collector)) {foundCollector = true;休息;}++j;}
列表行包含具有多列的单个行,我正在尝试查找列中包含特定名称的行.在我的 for 循环中,我试图使用相对 xpath 来查找元素,这甚至可能吗?或者我是否需要提供整个 xpath 我用来查找带有单独 div 的附加 xpath 的行?
我不能保证列的顺序,这就是我必须这样做的原因.
这是我用来获取行的 xpath:
String rowsXpath = "//div[@id=\"QosDashpardPanelBottom\"]//div[@id=\"CollectorQoSPerformanceMetricsgrid\"]//div[contains(@class, \"x-grid3-row x-unselectable-single\")]";
这是 HTML:
<script type="text/javascript"><div id="topNavDiv" style="height: 90px"><div id="bodyContentOuter" style="width: 1280px; height: 587px;"><div id="bodyContentInner"><script src="RLT/RLT.nocache.js" language="javascript" type="text/javascript"><脚本延迟=延迟"><script language="javascript" type="text/javascript"><div id="rtcpMain" class="x-component x-border-layout-ct" style="width: 1280px; height: 587px;"><div id="rtcpMainWest" class="x-panel x-component x-border-panel" style="left: 5px; top: 5px; width: 225px;"><div id="x-auto-2" class=" x-tab-panel x-component x-border-panel" tabindex="0" hidefocus="true" style="left: 235px; top: 5px;宽度:1040px;"><div class="x-tab-panel-header x-unselectable" style="width: 1038px;"不可选择=开"><div class="tone-rtcp-tabbed-content-panel" style="width: 1040px; height: 550px;"><div id="x-auto-10" class="x-component" style="overflow: auto; width: 1040px; height: 550px;"><div id="QosDashboardPanel0" class="x-panel x-component" style="width: 1040px;"><div id="x-auto-13" class="x-small-editor x-panel-header x-component x-hide-display" role="presentation"><div id="rtcpDPBWrap" class="x-panel-bwrap" role="presentation" style="overflow:visible;"><div class="x-panel-tbar x-panel-tbar-noheader" role="presentation" style="width: 1040px;"><div id="rtcpDPBody" class="x-panel-body x-panel-body-noheader x-border-layout-ct" role="presentation" style="width: 1038px; height: 700px;"><div id="QosDashboardPanelTop" class=" x-component x-border-panel x-border-layout-ct" style="left: 0px; top: 0px; width: 1038px; height: 400px;"><div id="QosDashpardPanelBottom" class=" x-component x-border-panel x-border-layout-ct" style="left: 1px; top: 401px; width: 1036px; height: 298px;"><div id="QosDashpardPanel_pqosChartsLC" class=" x-component x-border-panel x-border-layout-ct x-hide-display" style="left: 0px; top: 0px; width: 1036px; height: 400px;"><div id="QosDashpardPanel_metricsTablesLC" class="x-component x-border-panel x-border-layout-ct" style="left: 1px; top: 1px; width: 1034px; height: 296px;" ><div id="CollectorMetrics_toneletWrapper" class=" x-panel x-component x-border-panel" style="left: 1px; top: 1px; width: 330px;"><div id="x-auto-99" class="x-small-editor x-panel-header x-component x-hide-display" role="presentation"><div class="x-panel-bwrap" role="presentation"><div class="x-panel-body x-panel-body-noheader" role="presentation" style="width: 328px; height: 292px;"><div id="CollectorMetrics" class="x-panel x-component" style="width: 328px;"><div id="x-auto-109" class="x-small-editor x-panel-header x-component x-unselectable" role="presentation" unselectable="on"><div class="x-panel-bwrap" role="presentation"><div class="x-panel-body" role="presentation" style="width: 326px; height: 265px;"><div id="CollectorQoSPerformanceMetricsgrid" class=" x-grid-panel x-component" style="position: relative; width: 326px; height: 265px;"tabindex="0" hidefocus="true" unselectable=""><div class="x-grid3" role="presentation" style="width: 326px; height: 265px;"><div class="x-grid3-viewport" role="presentation"><div class="x-grid3-header" role="presentation"><div class="x-grid3-scroller" role="presentation" style="width: 326px; height: 243px;"><div class="x-grid3-body" role="presentation"><div id="CollectorQoSPerformanceMetricsgrid_x-auto-633" class="x-grid3-row x-unselectable-single x-grid3-row-selected x-grid3-highlightrow " style="width:510px;"><table class="x-grid3-row-table" cellspacing="0" cellpadding="0" border="0" style="width:510px;"角色=演示"><tbody role="演示文稿"><tr role="演示文稿"><td id="x-auto-634" class="x-grid3-col x-grid3-cell x-grid3-td-name x-grid-cell-first" style="width:148px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-name" unselectable="on"><u>Lync</u>
</td><td id="x-auto-635" class="x-grid3-col x-grid3-cell x-grid3-td-badCalls" style="width:53px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-badCalls" unselectable="on">36</div></td><td id="x-auto-636" class="x-grid3-col x-grid3-cell x-grid3-td-totalCalls" style="width:58px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-totalCalls" unselectable="on">120</div></td><td id="x-auto-637" class="x-grid3-col x-grid3-cell x-grid3-td-avgLatency" style="width:73px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgLatency" unselectable="on">223</div></td><td id="x-auto-638" class="x-grid3-col x-grid3-cell x-grid3-td-avgLoss" style="width:53px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgLoss" unselectable="on">0.80</div></td><td id="x-auto-639" class="x-grid3-col x-grid3-cell x-grid3-td-avgJitter " style="width:58px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgJitter" unselectable="on">29</div></td><td id="x-auto-640" class="x-grid3-col x-grid3-cell x-grid3-td-avgMOS x-grid3-cell-last " style="width:53px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgMOS" unselectable="on">3.86</div></td></tr></tbody>
<div id="CollectorQoSPerformanceMetricsgrid_x-auto-641" class="x-grid3-row x-unselectable-single" style="width:510px;"><table class="x-grid3-row-table" cellspacing="0" cellpadding="0" border="0" style="width:510px;"角色=演示"><tbody role="演示文稿"><tr role="演示文稿"><td id="x-auto-642" class="x-grid3-col x-grid3-cell x-grid3-td-name x-grid-cell-first" style="width:148px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-name" unselectable="on"><u>CUCM-Publisher</u>
</td><td id="x-auto-643" class="x-grid3-col x-grid3-cell x-grid3-td-badCalls" style="width:53px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-badCalls" unselectable="on">3</div></td><td id="x-auto-644" class="x-grid3-col x-grid3-cell x-grid3-td-totalCalls" style="width:58px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-totalCalls" unselectable="on">52</div></td><td id="x-auto-645" class="x-grid3-col x-grid3-cell x-grid3-td-avgLatency" style="width:73px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgLatency" unselectable="on">190</div></td><td id="x-auto-646" class="x-grid3-col x-grid3-cell x-grid3-td-avgLoss" style="width:53px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgLoss" unselectable="on">0.79</div></td><td id="x-auto-647" class="x-grid3-col x-grid3-cell x-grid3-td-avgJitter" style="width:58px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgJitter" unselectable="on">31</div></td><td id="x-auto-648" class="x-grid3-col x-grid3-cell x-grid3-td-avgMOS x-grid3-cell-last " style="width:53px;"角色=网格单元"><div class="x-grid3-cell-inner x-grid3-col-avgMOS" unselectable="on">3.98</div></td></tr></tbody>
解决方案
是的,这绝对是可能的.看到这个:
//查找外部元素.WebElement outer = driver.findElement(By.anything("whatever"));//这不起作用,它会在整个页面中搜索 XPath 表达式.WebElement inner = external.findElement(By.xpath("//some/nasty/xpath"));//这有效!它以外部元素为根.WebElement inner = external.findElement(By.xpath(".//some/nasty/xpath"));
因此,如果我很好地理解您的需求,您的 XPath 表达式需要如下所示:
By.xpath("(.//tbody)[" + j + "]//div[text()=\"" +collector + "\"])")
<小时>
编辑(天哪,HTML 太多了,实际上只需要一小部分:).
既然我抓住了你想要的东西,我认为你根本不需要这种方法.试试这个:
WebElement row = driver.findElement(By.xpath("id('CollectorQoSPerformanceMetricsgrid')//div[contains(@class,'x-grid3-row x-unselectable-single') and .//u[text()='" + 收集器 + "']]"));
仅 XPath 表达式:
id('CollectorQoSPerformanceMetricsgrid')//div[contains(@class,'x-grid3-row x-unselectable-single')和 .//u[text()='" + 收集器 + "'] ]
拆开:
FIND ELEM WITH ID = 'CollectorQoSPerformanceMetricsgrid'id('CollectorQoSPerformanceMetricsgrid')在@CLASS 中查找包含x-grid3-row x-unselectable-single"的所有 DIV 元素//div[contains(@class,'x-grid3-row x-unselectable-single')并且有一个 <U>带有文本等于收集器变量的后代和 .//u[text()='" + 收集器 + "'] ]
这只会为您找到一条命令所需的单行.
如果您想坚持使用当前的解决方案,请尝试:
String rowsXpath = "id('CollectorQoSPerformanceMetricsgrid')//div[contains(@class, 'x-grid3-row x-unselectable-single')]";列表行 = driver.findElements(By.xpath(rowsXpath));boolean foundCollector = false;for(WebElement 行:行){if(!row.findElements(By.xpath(".//u[text()='" + 收集器 + "']")).isEmpty()) {foundCollector = true;休息;}}
Is it possible to use a relative xpath after I've gathered a list of WebElements? If so what's the best way to do it?
This is what I have:
List <WebElement> rows = driver.findElements(By.xpath(rowsXpath));
int j = 1;
boolean foundCollector = false;
for(WebElement e : rows) {
String c = e.findElement(By.xpath("(//tbody)[" + j + "]//u[text()=\"" + collector + "\"])")).getText();
if(c.equals(collector)) {
foundCollector = true;
break;
}
++j;
}
the list rows contains individual rows with multiple columns and I'm trying to find the row which contains a particular name in a column. Within my for loop I was trying to use a relative xpath to look for an element, is this even possible? Or do I need to provide the whole xpath I used to find the rows with the additional xpath for the individual divs?
I'm not guaranteed the order of the columns which is why I have to do it this way.
This is the xpath I used to obtain the rows:
String rowsXpath = "//div[@id=\"QosDashpardPanelBottom\"]//div[@id=\"CollectorQoSPerformanceMetricsgrid\"]//div[contains(@class, \"x-grid3-row x-unselectable-single\")]";
Here's the HTML:
<body class=" ext-gecko ext-windows" onload="processLoaders();">
<script type="text/javascript">
<div id="topNavDiv" style="height: 90px">
<div id="bodyContentOuter" style="width: 1280px; height: 587px;">
<div id="bodyContentInner">
<script src="RLT/RLT.nocache.js" language="javascript" type="text/javascript">
<script defer="defer">
<script language="javascript" type="text/javascript">
<div id="rtcpMain" class=" x-component x-border-layout-ct" style="width: 1280px; height: 587px;">
<div id="rtcpMainWest" class=" x-panel x-component x-border-panel" style="left: 5px; top: 5px; width: 225px;">
<div id="x-auto-2" class=" x-tab-panel x-component x-border-panel" tabindex="0" hidefocus="true" style="left: 235px; top: 5px; width: 1040px;">
<div class="x-tab-panel-header x-unselectable" style="width: 1038px;" unselectable="on">
<div class="tone-rtcp-tabbed-content-panel" style="width: 1040px; height: 550px;">
<div id="x-auto-10" class=" x-component" style="overflow: auto; width: 1040px; height: 550px;">
<div id="QosDashboardPanel0" class=" x-panel x-component" style="width: 1040px;">
<div id="x-auto-13" class=" x-small-editor x-panel-header x-component x-hide-display" role="presentation">
<div id="rtcpDPBWrap" class="x-panel-bwrap" role="presentation" style="overflow: visible;">
<div class="x-panel-tbar x-panel-tbar-noheader" role="presentation" style="width: 1040px;">
<div id="rtcpDPBody" class="x-panel-body x-panel-body-noheader x-border-layout-ct" role="presentation" style="width: 1038px; height: 700px;">
<div id="QosDashboardPanelTop" class=" x-component x-border-panel x-border-layout-ct" style="left: 0px; top: 0px; width: 1038px; height: 400px;">
<div id="QosDashpardPanelBottom" class=" x-component x-border-panel x-border-layout-ct" style="left: 1px; top: 401px; width: 1036px; height: 298px;">
<div id="QosDashpardPanel_pqosChartsLC" class=" x-component x-border-panel x-border-layout-ct x-hide-display" style="left: 0px; top: 0px; width: 1036px; height: 400px;">
<div id="QosDashpardPanel_metricsTablesLC" class=" x-component x-border-panel x-border-layout-ct" style="left: 1px; top: 1px; width: 1034px; height: 296px;">
<div id="CollectorMetrics_toneletWrapper" class=" x-panel x-component x-border-panel" style="left: 1px; top: 1px; width: 330px;">
<div id="x-auto-99" class=" x-small-editor x-panel-header x-component x-hide-display" role="presentation">
<div class="x-panel-bwrap" role="presentation">
<div class="x-panel-body x-panel-body-noheader" role="presentation" style="width: 328px; height: 292px;">
<div id="CollectorMetrics" class=" x-panel x-component" style="width: 328px;">
<div id="x-auto-109" class=" x-small-editor x-panel-header x-component x-unselectable" role="presentation" unselectable="on">
<div class="x-panel-bwrap" role="presentation">
<div class="x-panel-body" role="presentation" style="width: 326px; height: 265px;">
<div id="CollectorQoSPerformanceMetricsgrid" class=" x-grid-panel x-component" style="position: relative; width: 326px; height: 265px;" tabindex="0" hidefocus="true" unselectable="">
<div class="x-grid3" role="presentation" style="width: 326px; height: 265px;">
<div class="x-grid3-viewport" role="presentation">
<div class="x-grid3-header" role="presentation">
<div class="x-grid3-scroller" role="presentation" style="width: 326px; height: 243px;">
<div class="x-grid3-body" role="presentation">
<div id="CollectorQoSPerformanceMetricsgrid_x-auto-633" class="x-grid3-row x-unselectable-single x-grid3-row-selected x-grid3-highlightrow " style="width:510px;">
<table class="x-grid3-row-table" cellspacing="0" cellpadding="0" border="0" style="width:510px;" role="presentation">
<tbody role="presentation">
<tr role="presentation">
<td id="x-auto-634" class="x-grid3-col x-grid3-cell x-grid3-td-name x-grid-cell-first " style="width:148px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-name" unselectable="on">
<u>Lync</u>
</div>
</td>
<td id="x-auto-635" class="x-grid3-col x-grid3-cell x-grid3-td-badCalls " style="width:53px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-badCalls" unselectable="on">36</div>
</td>
<td id="x-auto-636" class="x-grid3-col x-grid3-cell x-grid3-td-totalCalls " style="width:58px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-totalCalls" unselectable="on">120</div>
</td>
<td id="x-auto-637" class="x-grid3-col x-grid3-cell x-grid3-td-avgLatency " style="width:73px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgLatency" unselectable="on">223</div>
</td>
<td id="x-auto-638" class="x-grid3-col x-grid3-cell x-grid3-td-avgLoss " style="width:53px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgLoss" unselectable="on">0.80</div>
</td>
<td id="x-auto-639" class="x-grid3-col x-grid3-cell x-grid3-td-avgJitter " style="width:58px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgJitter" unselectable="on">29</div>
</td>
<td id="x-auto-640" class="x-grid3-col x-grid3-cell x-grid3-td-avgMOS x-grid3-cell-last " style="width:53px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgMOS" unselectable="on">3.86</div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="CollectorQoSPerformanceMetricsgrid_x-auto-641" class="x-grid3-row x-unselectable-single " style="width:510px;">
<table class="x-grid3-row-table" cellspacing="0" cellpadding="0" border="0" style="width:510px;" role="presentation">
<tbody role="presentation">
<tr role="presentation">
<td id="x-auto-642" class="x-grid3-col x-grid3-cell x-grid3-td-name x-grid-cell-first " style="width:148px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-name" unselectable="on">
<u>CUCM-Publisher</u>
</div>
</td>
<td id="x-auto-643" class="x-grid3-col x-grid3-cell x-grid3-td-badCalls " style="width:53px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-badCalls" unselectable="on">3</div>
</td>
<td id="x-auto-644" class="x-grid3-col x-grid3-cell x-grid3-td-totalCalls " style="width:58px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-totalCalls" unselectable="on">52</div>
</td>
<td id="x-auto-645" class="x-grid3-col x-grid3-cell x-grid3-td-avgLatency " style="width:73px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgLatency" unselectable="on">190</div>
</td>
<td id="x-auto-646" class="x-grid3-col x-grid3-cell x-grid3-td-avgLoss " style="width:53px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgLoss" unselectable="on">0.79</div>
</td>
<td id="x-auto-647" class="x-grid3-col x-grid3-cell x-grid3-td-avgJitter " style="width:58px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgJitter" unselectable="on">31</div>
</td>
<td id="x-auto-648" class="x-grid3-col x-grid3-cell x-grid3-td-avgMOS x-grid3-cell-last " style="width:53px;" role="gridcell">
<div class="x-grid3-cell-inner x-grid3-col-avgMOS" unselectable="on">3.98</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
解决方案
Yes, this is definitely possible. See this:
// Find the outer element.
WebElement outer = driver.findElement(By.anything("whatever"));
// This doesn't work, it searches the whole page for the XPath expression.
WebElement inner = outer.findElement(By.xpath("//some/nasty/xpath"));
// This works! It takes the outer element as root.
WebElement inner = outer.findElement(By.xpath(".//some/nasty/xpath"));
Therefore, if I understood your need well, your XPath expression needs to look like this:
By.xpath("(.//tbody)[" + j + "]//div[text()=\"" + collector + "\"])")
EDIT (Holy cow, that's a lot of HTML and only a small amount of it is actually needed :).)
Now that I caught what you're after, I think you don't need this approach at all. Try this instead:
WebElement row = driver.findElement(By.xpath("id('CollectorQoSPerformanceMetricsgrid')//div[contains(@class,'x-grid3-row x-unselectable-single') and .//u[text()='" + collector + "']]"));
Only the XPath expression:
id('CollectorQoSPerformanceMetricsgrid')
//div[contains(@class,'x-grid3-row x-unselectable-single')
and .//u[text()='" + collector + "'] ]
Taken apart:
FIND ELEM WITH ID = 'CollectorQoSPerformanceMetricsgrid'
id('CollectorQoSPerformanceMetricsgrid')
FIND ALL DIV ELEMS THAT CONTAIN 'x-grid3-row x-unselectable-single' IN @CLASS
//div[contains(@class,'x-grid3-row x-unselectable-single')
AND HAVE AN <U> DESCENDANT WITH TEXT EQUAL TO collector VARIABLE
and .//u[text()='" + collector + "'] ]
This finds you only the single row you need with a single command.
If you rather want to stick with your current solution, try:
String rowsXpath = "id('CollectorQoSPerformanceMetricsgrid')//div[contains(@class, 'x-grid3-row x-unselectable-single')]";
List<WebElement> rows = driver.findElements(By.xpath(rowsXpath));
boolean foundCollector = false;
for(WebElement row : rows) {
if(!row.findElements(By.xpath(".//u[text()='" + collector + "']")).isEmpty()) {
foundCollector = true;
break;
}
}
这篇关于来自 WebElements 列表的相对 Xpath的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!