定位下拉框的XPath表达式
我有点沮丧,因为我在一个 <table>
的网页元素中,用 by.XPATH
和 following-sibling
来查找一个元素,但系统找不到我想要的元素。
我想把标记为 "katja@katja.com" 的电子邮件地址的下拉选项从 "Standard" 改成 "Admin"。
但是,属性 ID
的值 "role" 不是唯一的。没有唯一的属性可以用来找到这个元素。
这个表格看起来是这样的(我找不到可以搜索的唯一 id 或名称):
<tbody> <tr id="0dca86a5-13d3-4ab5-a2e6-e75ab381dca9">
<td class="emailAddress">max@max.com</td>
<td class="role">
<form action="/echo/UserManagement/UpdateRole?userId=0dca86a5-13d3-4ab5-a2e6-e75ab381dca9&accountReference=4711&username=max%40max.com" method="post" novalidate="novalidate">
<div class="field-inline">
<select class="roles medium" id="role" name="role"><option value="Admin">Admin</option>
<option value="Standard">Standard</option>
<option selected="selected" value="Basic">Basic</option>
<option value="Template">Template</option>
</select>
</div>
<div class="field-inline">
<button class="button button-primary save" type="submit">Save</button>
<noscript>
<button class="button button-primary" type="submit">Save</button>
</noscript>
</div>
</form>
</td>
<td class="action">
<form action="/echo/UserManagement/RemoveUserFromAccount" method="post" novalidate="novalidate"><input id="userId" name="userId" type="hidden" value="0a23788b-0ed6-401b-a11e-8004d34acf1a"><input id="usernameToRemove" name="usernameToRemove" type="hidden" value="max@max.com">
<input id="accountReference" name="accountReference" type="hidden" value="4711">
<button type="submit" class="button button-danger remove_user" data-confirm="true">Remove</button>
</form>
</td> </tr> <tr id="e5b128b5-75f9-4002-bcd9-11c8bc891d49">
<td class="emailAddress">john@john.com</td>
<td class="role">
<form action="/echo/UserManagement/UpdateRole?userId=e5b128b5-75f9-4002-bcd9-11c8bc891d49&accountReference=4711&username=john%40john.com" method="post" novalidate="novalidate">
<div class="field-inline">
<select class="roles medium" id="role" name="role"><option selected="selected" value="Admin">Admin</option>
<option value="Standard">Standard</option>
<option value="Basic">Basic</option>
<option value="Template">Template</option>
</select>
</div>
<div class="field-inline">
<button class="button button-primary save" type="submit">Save</button>
<noscript>
<button class="button button-primary" type="submit">Save</button>
</noscript>
</div>
</form>
</td>
<td class="action">
<form action="/echo/UserManagement/RemoveUserFromAccount" method="post" novalidate="novalidate"><input id="userId" name="userId" type="hidden" value="f45a18fc-4903-4189-8cab-c158630373a3"><input id="usernameToRemove" name="usernameToRemove" type="hidden" value="john@john.com">
<input id="accountReference" name="accountReference" type="hidden" value="4711">
<button type="submit" class="button button-danger remove_user" data-confirm="true">Remove</button>
</form>
</td> </tr> <tr id="5e356ca7-fa23-45a9-b7f3-c9e71ce5cb5f">
<td class="emailAddress">katja@katja.com</td>
<td class="role">
<form action="/echo/UserManagement/UpdateRole?userId=5e356ca7-fa23-45a9-b7f3-c9e71ce5cb5f&accountReference=4711&username=katja%40katja.com" method="post" novalidate="novalidate">
<div class="field-inline">
<select class="roles medium" id="role" name="role"><option value="Admin">Admin</option>
<option selected="selected" value="Standard">Standard</option>
<option value="Basic">Basic</option>
<option value="Template">Template</option>
</select>
</div>
<div class="field-inline">
<button class="button button-primary save" type="submit">Save</button>
<noscript>
<button class="button button-primary" type="submit">Save</button>
</noscript>
</div>
</form>
</td>
<td class="action">
<form action="/echo/UserManagement/RemoveUserFromAccount" method="post" novalidate="novalidate"><input id="userId" name="userId" type="hidden" value="1c094ceb-13a7-41cf-b754-921ac15dd9dc"><input id="usernameToRemove" name="usernameToRemove" type="hidden" value="katja@katja.com">
<input id="accountReference" name="accountReference" type="hidden" value="4711">
<button type="submit" class="button button-danger remove_user" data-confirm="true">Remove</button>
</form>
</td> </tr> </tbody>
我的代码尝试:
driver.find_element(By.XPATH, "//td[text()='katja@katja.com']/following-sibling::/form/select")
还有
driver.find_element(By.XPATH, "//td[text()='katja@katja.com']/following-sibling::*[1]/form/select")
1 个回答
0
试试下面这个XPath表达式:
(//form[contains(@action,'katja.com')]//following::select)[1]
解释:这个XPath表达式的意思是,它会选择第一个在任何一个带有“action”属性且包含“katja.com”字符串的<form>
元素后面的<select>
元素。
代码应该像这样:
driver.find_element(By.XPATH, "(//form[contains(@action,'katja.com')]//following::select)[1]"))
更新:如果你遇到No Such Element Exception
的错误,这可能有很多原因。可以按照下面答案中的故障排除步骤来解决这个问题。