如何通过表格中的部分文本找到元素,每行包含多行和单元格?

时间:2018-01-02 17:25:17

标签: python html selenium xpath

我的目标是基本上让Selenium点击"禁用"多次在多个行和单元格中隐藏在表中的链接。

我正在从Excel电子表格中读取以获取" P #####"的值。 (它总是第二个)循环。这些都是部分文本。 "随机词"在P #####之后,我不知道。所以我需要能够通过部分文本找到该元素,我认为我已经在自己的代码中完成了该文本,但是我无法验证该部分是否正常工作。

大约有1000行,我不需要全部访问它们。 a href标记的ID后跟随机数,与P #####值不对应。

这是HTML的样子(不是真实的):

<tbody>
  <tr>
    <td>1.</td>
    <td>P12345 randomwordshere</td>
    <td>..</td>
    <td>..</td>
    <td>
      <ul>
        <li>..</li>
        <li>..</li>
        <li><a id="disable_###" href="link">Disable</a></li>
      </ul>
    </td>
  </tr>
  <tr>
    <td>2.</td>
    <td>P23456 otherrandomwords</td>
    <td>..</td>
    <td>..</td>
    <td>
      <ul>
        <li>..</li>
        <li>..</li>
        <li><a id="disable_###" href="link">Disable</a></li>
      </ul>
  </tr>
  <tr>..</tr>
  <tr>..</tr>
  <tr>..</tr>
  <tr>..</tr>
  <tr>..</tr>
  <tr>..</tr>
  <tr>..</tr>
</tbody>

到目前为止,我的python代码的哪一部分看起来没有成功。

for x in range(0, num_rows):
  value = str(sheet.cell(x, 0))
  pcode = value[7:len(value) - 1]
  browser.implicitly_wait(10)
  browser.find_element_by_xpath("//*[contains(text(), '" + pcode + "')]")
  browser.find_element_by_xpath("//td/ul/li[contains(@id, 'disable')]").click() #this part is definitely wrong

那么如何在我所拥有的相同P ####值的行中找到每个禁用链接?

3 个答案:

答案 0 :(得分:0)

您需要找到pcode,然后执行以下操作以查找禁用。你目前正在这样做的方法就是抛弃第一个find_element。

这些方面的东西应该有用(它对我有用)。我认为对于python来说,它是跟随兄弟的。

(//*[contains(., 'P')]/following::li/a[contains(@id, 'disable')])[i]

将你的pcode放在'P'所在的位置,然后用for循环递增结果,这就是'[i]'的索引在最后。

显然,您需要进行自己的编辑,因为我们没有完整的代码来提供完整的答案,但这应该让您从正确的道路开始。

答案 1 :(得分:0)

您可以使用XPath执行此操作。

//td[contains(.,'P12345')]//following::a[starts-with(@id,'disable_')]

此XPath会查找包含您的P#的TD,然后查找标有以&#39;禁用_&#39;开头的ID的第一个A标记。

您需要更换&#39; P12345&#39;使用Excel中每个循环的值。这将返回所有禁用链接。只要您使用find_element(),它就会始终返回您想要的第一个。

答案 2 :(得分:0)

首先,使用下面的模式找到构成pcode的tr:

//tr[td[contains(text(), 'Database')]]假设这里的pcode是'数据库'

然后从找到的tr中找到“禁用”链接,如下所示:

//tr[td[contains(text(), 'Database')]]//a[text()='Disable']

尝试以下代码:

for x in range(0, num_rows):
  value = str(sheet.cell(x, 0))
  pcode = value[7:len(value) - 1]
  browser.implicitly_wait(10)
  browser.find_element_by_xpath("//tr[td[contains(text(), '" + pcode + "')]]//a[text()='Disable']").click()