如何在 selenium webdriver 中使用 xpath 找到包含的文本的确切值?
How can I find the exact value using xpath in selenium webdriver for text that contains ?
我在使用 xpath 从代码中选择确切文本 'Section' 时遇到问题。
** 明确地说,如果可能的话,我需要从元素的 innerText 或 innerHTML 中选择准确的文本,而不是 id。 **
我可以使用包含文本函数,但这会导致包含 'Section' 的其他部分匹配项也为 returned/highlighted:
//div[@aria-hidden='false']//ul/li[contains(text(),'Section')]
我试过使用以下方法,但我不知道我的语法是否正确,因为没有什么是 returned/highlighted:
//div[@aria-hidden='false']//ul/li[text()='Section')]
//div[@aria-hidden='false']//ul/li[.='Section']
//div[@aria-hidden='false']//ul/li[normalize-space(.)='Section']
这是检查节节点时显示的内容:
<li id="GOS--/40" class="nodecollapsed item parent-node xh-highlight" style="" xpath="1">
Section <span class="child-count"></span>
</li>
这是元素属性中显示的内容:
id: "GOS--/40"
innerHTML: "↵ Section <span class="child-count"></span>↵ "
innerText: " Section "
这里是 xml,它显示了返回的其他部分匹配项:
<div class="selection-list-dialog modal-dialog Dialog">
<div class="modal-content">
<div class="modal-header SectionHeader">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<span class="modal-title" data-lang="StandardItems">Standard Items</span>
</div>
<div class="modal-body selection-list-container" style="margin-top: 30px" id="base">
<div>
<span data-lang="SelectItemInstructions">Select the items you are interested in from the list.</span>
</div>
<br/>
<div class="pull-left selection-tree-container">
<h4 class="selection-list-title">
<span data-lang="Available">Available</span>
</h4>
<ul class="selection-list selection-tree-list">
<li id="CS--/14" class="nodecollapsed item parent-node">
Country Section <span class="child-count"></span>
</li>
<li id="Sec1--/23" class="nodecollapsed item parent-node">
Section 1 <span class="child-count"></span>
</li>
<li id="Sec2--/24" class="nodecollapsed item parent-node">
Section 2 <span class="child-count"></span>
</li>
<li id="GOS--/40" class="nodecollapsed item parent-node">
Section <span class="child-count"></span>
</li>
<li id="RS--/43" class="nodecollapsed item parent-node">
Regional Section <span class="child-count"></span>
</li>
尝试关注 xpath
看看是否有帮助。
//li[starts-with(@id,'GOS')][@class='nodecollapsed item parent-node xh-highlight']
或
//li[@class='nodecollapsed item parent-node xh-highlight'][@xpath='1']
您可以尝试使用下面的 XPath 来查找节节点
试试看有没有帮助
//li[@id='GOS--/40'][contains(text(),'Section')]
这是一场艰难的比赛。问题是您有许多相似的选项,它们都包含某种风格的 "Section" 并且很难将它们区分开来。除此之外,每个都包含一个不间断的 space
,这意味着 normalize-space()
也不会(直接)工作。
但是...我发现下面的 XPath 可以工作。
//li[normalize-space()='Section\u00a0']
normalize-space()
删除白色space(但不是  
)所以你必须用 \u00a0
添加它。我已经在本地测试过它并且可以正常工作。
让我把帽子扔进戒指里....
//li[(normalize-space(text()) = 'Section')]
这是仅从父级获取文本的方法。 (排除child(ren)中的文字)
在Python中:
def get_pure_element_text(element):
return driver.execute_script(
"""
var parent = arguments[0];
var child = parent.firstChild;
var textValue = "";
while(child) {
if (child.nodeType === Node.TEXT_NODE)
textValue += child.textContent;
child = child.nextSibling;
}
return textValue;""",
element).strip()
此方法将迭代所有 firstChild(直接子节点)并从所有文本节点中提取所有文本。
在这种情况下如果你想检索具有id GOS--/40
的li的文本,那么使用下面的方法。
element = driver.find_element_by_xpath("//li[@id='GOS--/40']")
print(get_pure_element_text(element))
分享这个方法,至少可以帮助其他人(如果不是在这种情况下的 OP)。
C# 实现:(未测试)
string get_pure_text(IWebDriver driver, IWebElement element){
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
return (string)js.ExecuteScript(""""
var parent = arguments[0];
var child = parent.firstChild;
var textValue = "";
while(child) {
if (child.nodeType === Node.TEXT_NODE)
textValue += child.textContent;
child = child.nextSibling;
}
return textValue;""",
element");
用法:
string output = get_pure_text(driver,element)
我在使用 xpath 从代码中选择确切文本 'Section' 时遇到问题。
** 明确地说,如果可能的话,我需要从元素的 innerText 或 innerHTML 中选择准确的文本,而不是 id。 **
我可以使用包含文本函数,但这会导致包含 'Section' 的其他部分匹配项也为 returned/highlighted:
//div[@aria-hidden='false']//ul/li[contains(text(),'Section')]
我试过使用以下方法,但我不知道我的语法是否正确,因为没有什么是 returned/highlighted:
//div[@aria-hidden='false']//ul/li[text()='Section')]
//div[@aria-hidden='false']//ul/li[.='Section']
//div[@aria-hidden='false']//ul/li[normalize-space(.)='Section']
这是检查节节点时显示的内容:
<li id="GOS--/40" class="nodecollapsed item parent-node xh-highlight" style="" xpath="1">
Section <span class="child-count"></span>
</li>
这是元素属性中显示的内容:
id: "GOS--/40"
innerHTML: "↵ Section <span class="child-count"></span>↵ "
innerText: " Section "
这里是 xml,它显示了返回的其他部分匹配项:
<div class="selection-list-dialog modal-dialog Dialog">
<div class="modal-content">
<div class="modal-header SectionHeader">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<span class="modal-title" data-lang="StandardItems">Standard Items</span>
</div>
<div class="modal-body selection-list-container" style="margin-top: 30px" id="base">
<div>
<span data-lang="SelectItemInstructions">Select the items you are interested in from the list.</span>
</div>
<br/>
<div class="pull-left selection-tree-container">
<h4 class="selection-list-title">
<span data-lang="Available">Available</span>
</h4>
<ul class="selection-list selection-tree-list">
<li id="CS--/14" class="nodecollapsed item parent-node">
Country Section <span class="child-count"></span>
</li>
<li id="Sec1--/23" class="nodecollapsed item parent-node">
Section 1 <span class="child-count"></span>
</li>
<li id="Sec2--/24" class="nodecollapsed item parent-node">
Section 2 <span class="child-count"></span>
</li>
<li id="GOS--/40" class="nodecollapsed item parent-node">
Section <span class="child-count"></span>
</li>
<li id="RS--/43" class="nodecollapsed item parent-node">
Regional Section <span class="child-count"></span>
</li>
尝试关注 xpath
看看是否有帮助。
//li[starts-with(@id,'GOS')][@class='nodecollapsed item parent-node xh-highlight']
或
//li[@class='nodecollapsed item parent-node xh-highlight'][@xpath='1']
您可以尝试使用下面的 XPath 来查找节节点
试试看有没有帮助
//li[@id='GOS--/40'][contains(text(),'Section')]
这是一场艰难的比赛。问题是您有许多相似的选项,它们都包含某种风格的 "Section" 并且很难将它们区分开来。除此之外,每个都包含一个不间断的 space
,这意味着 normalize-space()
也不会(直接)工作。
但是...我发现下面的 XPath 可以工作。
//li[normalize-space()='Section\u00a0']
normalize-space()
删除白色space(但不是  
)所以你必须用 \u00a0
添加它。我已经在本地测试过它并且可以正常工作。
让我把帽子扔进戒指里....
//li[(normalize-space(text()) = 'Section')]
这是仅从父级获取文本的方法。 (排除child(ren)中的文字)
在Python中:
def get_pure_element_text(element):
return driver.execute_script(
"""
var parent = arguments[0];
var child = parent.firstChild;
var textValue = "";
while(child) {
if (child.nodeType === Node.TEXT_NODE)
textValue += child.textContent;
child = child.nextSibling;
}
return textValue;""",
element).strip()
此方法将迭代所有 firstChild(直接子节点)并从所有文本节点中提取所有文本。
在这种情况下如果你想检索具有id GOS--/40
的li的文本,那么使用下面的方法。
element = driver.find_element_by_xpath("//li[@id='GOS--/40']")
print(get_pure_element_text(element))
分享这个方法,至少可以帮助其他人(如果不是在这种情况下的 OP)。
C# 实现:(未测试)
string get_pure_text(IWebDriver driver, IWebElement element){
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
return (string)js.ExecuteScript(""""
var parent = arguments[0];
var child = parent.firstChild;
var textValue = "";
while(child) {
if (child.nodeType === Node.TEXT_NODE)
textValue += child.textContent;
child = child.nextSibling;
}
return textValue;""",
element");
用法:
string output = get_pure_text(driver,element)