查找具有相同地址位置的XPATH中的相同文本
问题描述:
虽然此信息无助于解决我的问题,但我会让它知道我正在使用Selenium WebDriver在Python中创建自动化测试。查找具有相同地址位置的XPATH中的相同文本
我有一个问题,我想验证两个相同的文本元素,看起来有相同的XPATH地址的存在。正如你可以从下面的网页的XPATH看到...
<div class="pagebox">
<h2>Database</h2>
Restrict access to group: <input id="database_group" name="database_group" value="postgres" type="text">
<br></br>
<h2>Sessions</h2>
User sessions time out after
<input id="session_timeout" name="session_timeout" maxlength="5" value="1200" type="text">
minutes.
<br></br>
<h2>HMI</h2>
<input id="use_large_header_text" name="use_large_header_text" type="checkbox">
Use large text in the header bar and link bar on HMI
<br></br>
<input id="display_tagging_button" name="display_tagging_button" checked="true" type="checkbox">
Display tagging button and information in HMI control dialog
<br></br>
<br></br>
<h2>Inactive Redirect</h2>
Auto redirect after user is inactive for
<input id="inactive_time" name="inactive_time" maxlength="4" placeholder="Min: 0 (Default) Max: 1440" size="25" value="0" type="text"></input>
minutes.
<span id="ieInactTime" style="font-style: italic"> Min: 0 (Default) Max: 1440</span>
<br></br>
Redirect Address:
<input id="inactive_page" name="inactive_page" placeholder="File Path e.g. /Home/" size="30" value="" type="text"><span id="ieInactPage" style="font-style: italic"> File Path e.g. /Home/</span>
<br></br>
...短语“分钟”。显示了两次[第8行和第21行],但它没有以我可以使用元素的XPATH定位我想验证哪个元素的方式显示,因为我通常会使用您会发现的方法here,here或here。这两个文本元素似乎有相同的确切地址XPATH:
//div[@class='pagebox']
我试着用括号来表示两个文本元素之间的区分,我想验证哪些文本元素...
e.g. //div[@class='pagebox']/[1] & //div[@class='pagebox']/[2]
...但没有奏效。
我能找到的最接近的区分这两种文本元素的方法是使用XPATH的'text()'特性。
//div[@class='pagebox']/text()[contains(.,'minutes')][1]
//div[@class='pagebox']/text()[contains(.,'minutes')][2]
有什么方法可以用XPATH验证这两个文本元素吗?
答
要在两个不同的文本元素区分“分钟”。,您需要以下XPATH:
对于第一个“分钟”。://div[@class='pagebox'][text()[contains(.,'minutes')][1]]
对于第二“分钟”。://div[@class='pagebox'][text()[contains(.,'minutes')][2]]
答
您可以使用JavaScriptExecutor在元素div中查找文本节点。请参见下面的C#代码:
IWebElement e = driver.FindElement(By.ClassName("pagebox"));
string script = "var nodes = arguments[0].childNodes;" +
"var text = [];" +
"var count=0;" +
"for (var i = 0; i < nodes.length; i++) {" +
" if ((nodes[i].nodeType == Node.TEXT_NODE) && (nodes[i].textContent.trim()=='minutes.')) {" +
" text[count]= nodes[i].textContent.trim();" +
" count++;" +
" }" +
"}" +
"return text;";
Object obj = ((IJavaScriptExecutor)driver).ExecuteScript(script,e);
您可以在检查器中将每个“分钟”字符串重命名为minutes_X。应该更容易找到你正在寻找的那个。 –
在您的示例代码中,// // div [@ class ='pagebox']/input [2]'是“在HMI上的标题栏和链接栏中使用大文本”。使用'input [n]'是你如何区分它们。你在问什么? – SiKing
@KevinS重命名“分钟”。不幸的是,字符串不是一种选择。这是我坚持不懈的方案,必须找到一种方法来实现它。 – rwbyrd