angular - 如何构造 XPath 以包含 HTML 中的特定元素?

标签 angular selenium xpath webdriverwait xpath-1.0

我有一张 table ,我只想选择那张 table 上的按钮。我们可以看到,这张 table 上只有 4 个按钮:

enter image description here

我创建了以下 Xpath 来过滤掉这些 4 个按钮 ,页面上没有其他按钮:

//*[@id="studentListTable"]/thead/tr/th[contains(., "Actions")]//following::button  | //*[@id="studentListTable_info"]//preceding::button 
  • @id="studentListTable_info"指的是文本“显示 1 到 3 个条目,共 3 个条目”。

  • 但这不起作用。
    这个 XPath 实际上定位页面上的所有按钮,而与按钮的位置无关。

    这里有什么问题?

    我怎样才能修复它,以便这个表达式只定位四个按钮?

    HTML 片段:

    <div _ngcontent-c7="" appcard="" class="card">
        <div _ngcontent-c7="" class="card-header">
            <h5 _ngcontent-c7="">Student list <!----></h5></div>
        <ul _ngcontent-c7="" class="card-actions">
            <li _ngcontent-c7="">
                <button _ngcontent-c7="" appcardfullscreen="" class="card-action">
                    <i _ngcontent-c7="" class="fa fa-arrows-alt"></i></button></li>
            <li _ngcontent-c7="">
                <button _ngcontent-c7="" appcardcollapse="" class="card-action icon-collapse"><i _ngcontent-c7="" class="material-icons">expand_more</i></button></li></ul>
        <!---->
        <div _ngcontent-c7="" class="card-body">
            <div id="studentListTable_wrapper" class="dataTables_wrapper no-footer">
                <div class="dataTables_length" id="studentListTable_length">
                    <label>Show <select name="studentListTable_length" aria-controls="studentListTable" class="">
                        <option value="10">10</option>
                        <option value="25">25</option>
                        <option value="50">50</option><option value="100">100</option>
                    </select> entries</label></div>
                <div id="studentListTable_filter" class="dataTables_filter">
                    <label>Search:<input type="search" class="" placeholder="" aria-controls="studentListTable"></label>
                </div>
                <table _ngcontent-c7="" class="table table-striped dataTable no-footer" datatable="" id="studentListTable" role="grid" aria-describedby="studentListTable_info">
                <thead _ngcontent-c7="">
                <tr _ngcontent-c7="" role="row">
                    <th _ngcontent-c7="" class="sorting_asc" tabindex="0" aria-controls="studentListTable" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Student ID: activate to sort column descending" style="width: 101px;">Student ID</th>
                     <th _ngcontent-c7="" class="sorting_disabled" rowspan="1" colspan="1" aria-label="Actions" style="width: 106px;">Actions</th></tr>
                </thead><!----><tbody _ngcontent-c7=""><!---->
                <tr _ngcontent-c7="" role="row" class="odd">
                    <td _ngcontent-c7="" class="sorting_1">123456</td>
                     <td _ngcontent-c7="">
                        <a href="unsafe:javascript:void(0)">
                            <i class="material-icons text-warning">info</i> Not Started</a></td>
                    <td _ngcontent-c7="">Null</td>
                    <td _ngcontent-c7="" class="text-left"><!----><div _ngcontent-c7="">
                        <button _ngcontent-c7="" class="btn btn-sm btn-sm-action mr-2 btn-outline-info" container="body" placement="left" popoverclass="btn-popover" triggers="mouseenter:mouseleave" type="button" tabindex="0">
                            <i _ngcontent-c7="" class="fa fa-arrow-right"></i></button></div><!----><!----><!----></td></tr>
                <tr _ngcontent-c7="" role="row" class="even">
                    <td _ngcontent-c7="" class="sorting_1">153246</td>
                     <td _ngcontent-c7=""><a href="unsafe:javascript:void(0)"><i class="fa fa-unlock mr-2"></i>In Progress</a></td>
                    <td _ngcontent-c7="">Herndon MS</td>
                    <td _ngcontent-c7="" class="text-left"><!----><!----><div _ngcontent-c7=""><!----><div _ngcontent-c7="" class="d-flex align-items-center">
                        <button _ngcontent-c7="" class="btn btn-sm btn-sm-action mr-2 btn-outline-info col" container="body" placement="left" popoverclass="btn-popover" triggers="mouseenter:mouseleave" type="button" tabindex="0">
                            <i _ngcontent-c7="" class="fa fa-pencil"></i></button>
                        <button _ngcontent-c7="" class="btn btn-sm btn-sm-action mr-2 btn-outline-danger col" container="body" placement="left" popoverclass="btn-popover" triggers="mouseenter:mouseleave" type="button">
                            <i _ngcontent-c7="" class="fa fa-trash-o"></i></button></div><!----></div><!----><!----></td></tr>
                <tr _ngcontent-c7="" role="row" class="odd">
                    <td _ngcontent-c7="" class="sorting_1">234135</td>
                     <td _ngcontent-c7="" class="text-left"><!----><!----><!---->
                        <div _ngcontent-c7="">
                            <button _ngcontent-c7="" class="btn btn-sm btn-sm-action mr-2 btn-outline-info" container="body" placement="left" popoverclass="btn-popover" triggers="mouseenter:mouseleave" type="button" tabindex="0">
                                <i _ngcontent-c7="" class="fa fa-eye"></i></button></div><!----></td></tr></tbody><!----><!----><!----></table>
                <div class="dataTables_info" id="studentListTable_info" role="status" aria-live="polite">Showing 1 to 3 of 3 entries</div>
                <div class="dataTables_paginate paging_simple_numbers" id="studentListTable_paginate">
                    <a class="paginate_button previous disabled" aria-controls="studentListTable" data-dt-idx="0" tabindex="0" id="studentListTable_previous">Previous</a>
                    <span>
                        <a class="paginate_button current" aria-controls="studentListTable" data-dt-idx="1" tabindex="0">1</a>
                    </span>
                    <a class="paginate_button next disabled" aria-controls="studentListTable" data-dt-idx="2" tabindex="0" id="studentListTable_next">Next</a></div></div></div></div>

    最佳答案

    您可以使用以下 XPath-1.0 表达式:

    //table[@id="studentListTable" and thead/tr/th/text() =  "Actions"]/tbody/tr/td[@class="sorting_1"]
    

    选择以下三个项目:
    <td _ngcontent-c7="" class="sorting_1">123456</td>
    <td _ngcontent-c7="" class="sorting_1">153246</td>
    <td _ngcontent-c7="" class="sorting_1">234135</td>
    

    要进一步获取这三个 button 中包含的四个 table ,可以使用以下 XPath:
    //table[@id="studentListTable" and thead/tr/th/text() =  "Actions"]/tbody/tr/td[@class="sorting_1"]/../../tr/td//button
    

    其结果由以下四项组成:
    <button ... type="button" tabindex="0">
        <i _ngcontent-c7="" class="fa fa-arrow-right"/>
    </button>
    <button ... type="button" tabindex="0">
        <i _ngcontent-c7="" class="fa fa-pencil"/>
    </button>
    <button ... type="button">
        <i _ngcontent-c7="" class="fa fa-trash-o"/>
    </button>
    <button ... type="button" tabindex="0">
        <i _ngcontent-c7="" class="fa fa-eye"/>
    </button>
    

    关于angular - 如何构造 XPath 以包含 HTML 中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54429325/

    相关文章:

    testing - 如何以编程方式按下警报确定按钮?

    java - 使用 selenium 将内容拖放到文本框中

    Selenium Webdriver Python 如何从输入标签获取文本

    angular - 如何设计 ng-bootstrap Accordion ?

    Angular 2 多槽嵌入

    selenium - Webdriver : IE11: I/O exception (java.net.SocketException)在处理请求时捕获:软件导致连接中止:recv 失败

    java - 选择与 Selenium Webdriver 的链接?

    ruby - nokogiri xpath 属性 - 奇怪的结果

    angular - 禁止在 Nrwl Nx 中的同一库中导入桶文件

    javascript - 在谷歌自动完成更改设置值到公共(public)对象