1

我在使用 xpath 从代码中选择确切的文本“部分”时遇到问题。

** 需要明确的是,如果可能的话,我需要从元素的 innerText 或 innerHTML 中进行准确的文本选择,而不是 id。**

我可以使用包含文本功能,但这会导致包含“部分”的其他部分匹配也被返回/突出显示:


//div[@aria-hidden='false']//ul/li[contains(text(),'Section')]

我试过使用以下方法,但我不知道我的语法是否正确,因为没有返回/突出显示:


//div[@aria-hidden='false']//ul/li[text()='Section')]

//div[@aria-hidden='false']//ul/li[.='Section']

//div[@aria-hidden='false']//ul/li[normalize-space(.)='Section']

这是检查 Section 节点时显示的内容:


<li id="GOS--/40" class="nodecollapsed item parent-node xh-highlight" style="" xpath="1">
                                Section&nbsp;<span class="child-count"></span>
                            </li>

这是元素属性中显示的内容:


id: "GOS--/40"
innerHTML: "↵                                Section&nbsp;<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">&times;</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&nbsp;<span class="child-count"></span>
                            </li>                        


                            <li id="Sec1--/23" class="nodecollapsed item parent-node">
                                Section 1&nbsp;<span class="child-count"></span>
                            </li>


                            <li id="Sec2--/24" class="nodecollapsed item parent-node">
                                Section 2&nbsp;<span class="child-count"></span>
                            </li>


                            <li id="GOS--/40" class="nodecollapsed item parent-node">
                                Section&nbsp;<span class="child-count"></span>
                            </li>


                            <li id="RS--/43" class="nodecollapsed item parent-node">
                                Regional Section&nbsp;<span class="child-count"></span>
                            </li>

4

5 回答 5

3

这是一个艰难的过程。问题是您有许多类似的选项都包含某种风格的“部分”,并且很难将它们区分开来。更重要的是,每个都包含一个不间断的空间&nbsp;,这意味着它normalize-space()也不会(直接)工作。

但是...我发现下面的 XPath 可以工作。

//li[normalize-space()='Section\u00a0']

normalize-space()删除空格(但不是&nbsp),因此您必须将其添加到\u00a0. 我已经在本地对此进行了测试,并且可以正常工作。

于 2019-03-26T14:18:09.520 回答
0

试试看xpath是否有帮助。

 //li[starts-with(@id,'GOS')][@class='nodecollapsed item parent-node xh-highlight']

或者

  //li[@class='nodecollapsed item parent-node xh-highlight'][@xpath='1']
于 2019-03-26T11:44:06.037 回答
0

你可以试试下面的 XPath 来找到一个节节点

试试看有没有帮助

//li[@id='GOS--/40'][contains(text(),'Section')]

于 2019-03-26T12:03:08.743 回答
0

让我把帽子扔进戒指……

//li[(normalize-space(text()) = 'Section')]
于 2019-03-26T15:48:20.903 回答
0

这是仅从父级获取文本的方法。(不包括 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 的 li 文本,请GOS--/40使用以下方法。

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)
于 2019-03-26T23:45:24.333 回答