当前位置: 首页 > 知识库问答 >
问题:

Selenium选择表中的第一行,即使我正在遍历这些行

奚晟
2023-03-14

我真的不知道这里发生了什么,也弄不清楚,所以希望有人能帮助我。

本质上,我选择一个表,然后查找该表中的所有行。从这里开始,我在各行中循环,选择三个复选框,并检查它们是否被选中。然而,我得到的每一行的结果总是第一行的结果。例如

假真假

然后

假真假

当它应该更改每一行时。

Python/Selenium代码:

table = driver.find_element_by_xpath("//table[@id='tableMscRatesModal']/tbody")
rows = table.find_elements(By.XPATH, "//tr[@class='ng-scope']") # get all of the rows in the tables

for row in rows:
    print(row.text)

    manager_box = row.find_element_by_xpath("//td/input[@type='radio'][contains(@name, 'userRole')][@value='1']")
    standard_box = row.find_element_by_xpath("//td/input[@type='radio'][contains(@name, 'userRole')][@value='2']")
    no_box = row.find_element_by_xpath("//td/input[@type='radio'][contains(@name, 'userRole')][@value='3']")

    print(manager_box.is_selected())
    print(standard_box.is_selected())
    print(no_box.is_selected())

    if not (manager_box.is_selected() or standard_box.is_selected() or no_box.is_selected()):
        standard_box.send_keys(Keys.SPACE)

我在下面包含了一个两行的示例。对于x行的数量,这是完全相同的重复。

HTML:

<table id="tableMscRatesModal" ng-table="tableParams" class="table table-striped table-bordered" show-filter="false">
    <colgroup>
        <col span="1" style="width: 13%;">
            <col span="1" style="width: 13%;">
                <col span="1" style="width: 8%;">
                    <col span="1" style="width: 8%;">
                        <col span="1" style="width: 8%;">
                            <col span="1" style="width: 25%;">
                                <col span="1" style="width: 25%;">
    </colgroup>
    <tbody>
        <tr>
            <th>First name</th>
            <th>Last name</th>
            <th>Manager</th>
            <th>Standard user</th>
            <th>No access</th>
            <th>Proposed change</th>
            <th ng-show="iAmRequestManagerWithProposals(getUserList())" class="ng-hide">
                Approval
                <br>
                <br>
                <div class="row approvals">
                    <div class="col-xs-12">
                        <div class="input-group">
                            <span class="input-group-addon">
                                <label ng-click="rejectAll()">
                                    <input type="radio" name="rejectapproveall" id="rejectall" value="rejectall">
                                    Reject all
                                </label>
                            </span>
                            <span class="input-group-addon">
                                <label ng-click="approveAll()">
                                    <input type="radio" name="rejectapproveall" id="acceptall" value="acceptall">
                                    Approve all
                                </label>
                            </span>
                        </div>
                    </div>
                </div>
            </th>
        </tr>
        <!-- ngRepeat: accessUser in manageAccessControl.usersAndRoles | orderBy:['sortOrder','lastName','firstName'] -->
        <tr ng-repeat="accessUser in manageAccessControl.usersAndRoles | orderBy:['sortOrder','lastName','firstName']" class="ng-scope">
            <td class="ng-binding">First Name</td>
            <td class="ng-binding">Last Name</td>
            <td>
                <input type="radio" name="userRole" ng-value="hmwAccess.roles.manager" ng-model="accessUser.selectedRoleId" ng-disabled="accessUser.proposedRoleId || accessUser.isAmsAdmin" class="ng-pristine ng-untouched ng-valid ng-not-empty" value="1">
            </td>
            <td>
                <input type="radio" name="userRole" ng-value="hmwAccess.roles.stdUser" ng-model="accessUser.selectedRoleId" ng-disabled="accessUser.proposedRoleId || accessUser.isAmsAdmin" class="ng-pristine ng-untouched ng-valid ng-not-empty" value="2">
            </td>
            <td>
                <input type="radio" name="userRole" ng-value="hmwAccess.roles.noAccess" ng-model="accessUser.selectedRoleId" ng-disabled="accessUser.proposedRoleId || accessUser.isAmsAdmin" class="ng-pristine ng-untouched ng-valid ng-not-empty" value="3">
            </td>
            <td>
                <span ng-show="accessUser.proposedRoleId" class="ng-hide">
                    <img tooltip-placement="left" tooltip-append-to-body="true" uib-tooltip-html="getRoleChangeProposal(accessUser)" src="/img/infoIcon.png" style="width: 12px; height: 12px">
                    Pending manager approval
                </span>
                <span ng-show="accessUser.isAmsAdmin" class="ng-hide">
                    <img tooltip-placement="left" tooltip-append-to-body="true" uib-tooltip-html="amsAdminUserTooltip" src="/img/infoIcon.png" style="width: 12px; height: 12px">
                    AMS admin user
                </span>
            </td>
            <td ng-show="iAmRequestManagerWithProposals(getUserList())" class="ng-hide">

                <div class="row approvals">
                    <div class="col-xs-12">
                        <div class="input-group ng-hide" ng-show="accessUser.proposedRoleId &amp;&amp; accessUser.proposedRoleId > 0">
                            <span class="input-group-addon">
                                <label ng-click="setApprovalForUser(accessUser, hmwAccess.rejectApprove.rejected)">
                                    <input type="radio" name="rejectapprove" id="reject" value="rejected" ng-model="accessUser.rejectApprove" class="ng-pristine ng-untouched ng-valid ng-empty">
                                    Reject
                                </label>
                            </span>
                            <span class="input-group-addon">
                                <label ng-click="setApprovalForUser(accessUser, hmwAccess.rejectApprove.approved)">
                                    <input type="radio" name="rejectapprove" id="accept" value="approved" ng-model="accessUser.rejectApprove" class="ng-pristine ng-untouched ng-valid ng-empty">
                                    Approve
                                </label>
                            </span>
                        </div>
                    </div>
                </div>

            </td>
        </tr>
        <!-- end ngRepeat: accessUser in manageAccessControl.usersAndRoles | orderBy:['sortOrder','lastName','firstName'] -->
        <tr ng-repeat="accessUser in manageAccessControl.usersAndRoles | orderBy:['sortOrder','lastName','firstName']" class="ng-scope">
            <td class="ng-binding">First Name</td>
            <td class="ng-binding">Last Name</td>
            <td>
                <input type="radio" name="userRole" ng-value="hmwAccess.roles.manager" ng-model="accessUser.selectedRoleId" ng-disabled="accessUser.proposedRoleId || accessUser.isAmsAdmin" class="ng-pristine ng-untouched ng-valid ng-not-empty" value="1">
            </td>
            <td>
                <input type="radio" name="userRole" ng-value="hmwAccess.roles.stdUser" ng-model="accessUser.selectedRoleId" ng-disabled="accessUser.proposedRoleId || accessUser.isAmsAdmin" class="ng-pristine ng-untouched ng-valid ng-not-empty" value="2">
            </td>
            <td>
                <input type="radio" name="userRole" ng-value="hmwAccess.roles.noAccess" ng-model="accessUser.selectedRoleId" ng-disabled="accessUser.proposedRoleId || accessUser.isAmsAdmin" class="ng-pristine ng-untouched ng-valid ng-not-empty" value="3">
            </td>
            <td>
                <span ng-show="accessUser.proposedRoleId" class="ng-hide">
                    <img tooltip-placement="left" tooltip-append-to-body="true" uib-tooltip-html="getRoleChangeProposal(accessUser)" src="/img/infoIcon.png" style="width: 12px; height: 12px">
                    Pending manager approval
                </span>
                <span ng-show="accessUser.isAmsAdmin" class="ng-hide">
                    <img tooltip-placement="left" tooltip-append-to-body="true" uib-tooltip-html="amsAdminUserTooltip" src="/img/infoIcon.png" style="width: 12px; height: 12px">
                    AMS admin user
                </span>
            </td>
            <td ng-show="iAmRequestManagerWithProposals(getUserList())" class="ng-hide">

                <div class="row approvals">
                    <div class="col-xs-12">
                        <div class="input-group ng-hide" ng-show="accessUser.proposedRoleId &amp;&amp; accessUser.proposedRoleId > 0">
                            <span class="input-group-addon">
                                <label ng-click="setApprovalForUser(accessUser, hmwAccess.rejectApprove.rejected)">
                                    <input type="radio" name="rejectapprove" id="reject" value="rejected" ng-model="accessUser.rejectApprove" class="ng-pristine ng-untouched ng-valid ng-empty">
                                    Reject
                                </label>
                            </span>
                            <span class="input-group-addon">
                                <label ng-click="setApprovalForUser(accessUser, hmwAccess.rejectApprove.approved)">
                                    <input type="radio" name="rejectapprove" id="accept" value="approved" ng-model="accessUser.rejectApprove" class="ng-pristine ng-untouched ng-valid ng-empty">
                                    Approve
                                </label>
                            </span>
                        </div>
                    </div>
                </div>

            </td>
        </tr>

提前感谢!

共有1个答案

何哲
2023-03-14

使用xpath从另一个元素定位元素时,需要使用当前上下文

for row in rows:
    manager_box = row.find_element_by_xpath(".//td/input[@type='radio'][contains(@name, 'userRole')][@value='1']")
    standard_box = row.find_element_by_xpath(".//td/input[@type='radio'][contains(@name, 'userRole')][@value='2']")
    no_box = row.find_element_by_xpath(".//td/input[@type='radio'][contains(@name, 'userRole')][@value='3']")

如果使用list,还可以简化代码

checkboxes = row.find_elements_by_xpath(".//td/input[@type='radio'][contains(@name, 'userRole')]")
for checkbox in checkboxes:
    print(checkboxes.is_selected())

如果您删除print(row),则会更远

checkboxes = row.find_elements_by_xpath("//table[@id='tableMscRatesModal']/tbody//tr[@class='ng-scope']//td/input[@type='radio']")
for i in range(0, len(checkboxes), 3):
    print(checkboxes[i].is_selected())
    print(checkboxes[i + 1].is_selected())
    print(checkboxes[i + 2].is_selected())
 类似资料:
  • 我有一个网页,其中包含一个表格,该表格仅在我单击“检查元素”时出现,并且在查看源页面中不可见。该表仅包含两行,每行有几个单元格,看起来类似于此: 我试图做的是遍历行并返回每个单元格中包含的文本。我似乎真的不能用Selenium来做到这一点。元素不包含ID,我不知道如何获取它们。我不太熟悉使用xpath之类的。 这是一个返回的调试尝试: 从行中获取文本的简单方法是什么?

  • 奇怪的是,使用preverse,它试图从另一个表中选择一个复选框。下面是我使用前面的“开发工具”中突出显示的HTML: 我可以使用什么XPATH?

  • 问题内容: 所以我有2张桌子,和。 具有列,具有呼叫者的ID和进行呼叫的时间。然后,我有另一台已,,,,,有一个人,他们的位置的ID ,而且它们在该位置的时间。 我想写一个看起来像这样的查询: 基本上,这是在寻找给定值的最接近值。之后,最终,我想根据数据查找呼叫的位置。 我该怎么做?我知道有一种基于集合的方法,但是我不想那样做。我调查了一下,但是我感到在那方面的表现很糟糕……所以循环中是否有这样做

  • 我有一张自助表 我想做的是,当用户选中任何复选框时,在“选择”数据字段中,更改标题和描述的外观,例如,删除/斜体。我想使用这个“复选框”给用户一个直观的指示,一旦用户单击,这些行将从数据库中删除,一个单独的“删除”按钮。 提前感谢。

  • 因此,我一直在努力通过selenium找到一种动态方法,即遍历一个表并从该表中收集特定值,以创建从远程服务到本地数据标签的映射。下面是我试图迭代的代码,这些长度可能会改变: 我确信有一种方法可以在表中进行迭代,以动态的方式收集值,这样应该只需要: 字符串fee**“x”**=driver.findElement(by.xpath(“//tr//input[@id='feed']”)).getAtt

  • 18.7. 在选择这些技术时的一些考虑 这里提到的每种技术都有它的缺点。你在选择一种技术时,应该仔细考虑你的需要,你所暴露的服务和你在远程访问时传送的对象。 当使用RMI时,通过HTTP协议访问对象是不可能的,除非你用HTTP包裹RMI流。RMI是一种重量级的协议,因为它支持整个对象的序列化,当要求网络上传输复杂数据结构时这样的序列化是非常重要的。然而,RMI-JRMP只能绑定到Java客户端:它