【问题标题】:Selenium find elements using xpathSelenium 使用 xpath 查找元素
【发布时间】:2019-08-20 11:32:07
【问题描述】:

我需要找到投资者 A 的贷款金额元素(在本例中为 100、100)

有人可以建议如何编写 xpath 来查找这些元素

[示例] 在下面的屏幕截图中,我需要找到 xpath 以获取第一行和第二行中文本为 100 的元素,并为其选择了单选按钮。

xpath 下面给出了所有三个贷款金额

//td[contains(., "Investor A")]/preceding-sibling::td[descendant::input][1]/label/text()

但我只需要选择单选按钮的第一行和第二行的贷款金额

<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>
<html>

<head>
  <style>
    table {
      border: 1px dashed #cccccc;
      border-collapse: collapse;
    }

    table td {
      border: 1px dashed #cccccc;
    }
  </style>
</head>

<body>
  <table>
    <tr>
      <td>
        <label>Loan1</label>
      </td>
      <td>
        <input type='radio' name='L1' id='L1_one'></input>
        <label>100</label>
      </td>
      <td>
        <label>Investor A</label>
      </td>
      <td>
        <input type='radio' name='L1' id='L1_two'></input>
        <label>200</label>
      </td>
      <td>
        <label>Investor B</label>
      </td>
      <td>
        <input type='radio' name='L1' id='L1_three'></input>
        <label>300</label>
      </td>
      <td>
        <label>Investor C</label>
      </td>
    </tr>
    <tr>
      <td>
        <label>Loan2</label>
      </td>
      <td>
        <input type='radio' name='L2' id='L2_one'></input>
        <label>100</label>
      </td>
      <td>
        <label>Investor A</label>
      </td>
      <td>
        <input type='radio' name='L2' id='L2_two'></input>
        <label>200</label>
      </td>
      <td>
        <label>Investor B</label>
      </td>
      <td>
        <input type='radio' name='L2' id='L2_three'></input>
        <label>300</label>
      </td>
      <td>
        <label>Investor C</label>
      </td>
    </tr>
    <tr>
        <td>
          <label>Loan3</label>
        </td>
        <td>
          <input type='radio' name='L3' id='L3_one'></input>
          <label>100</label>
        </td>
        <td>
          <label>Investor A</label>
        </td>
        <td>
          <input type='radio' name='L3' id='L3_two'></input>
          <label>200</label>
        </td>
        <td>
          <label>Investor B</label>
        </td>
        <td>
          <input type='radio' name='L3' id='L3_three'></input>
          <label>300</label>
        </td>
        <td>
          <label>Investor C</label>
        </td>
      </tr>
  </table>
</body>

【问题讨论】:

  • 你想找到什么?单选按钮?
  • @GregBurghardt,我已经用示例更新了这个问题。如果您需要更多信息,请告诉我
  • 到目前为止,您尝试了哪些代码来获取元素?
  • xpath 下面给出了所有三个贷款金额 //td[contains(., "Investor A")]/preceding-sibling::td[descendant::input][1]/label/ text() 但我只需要选择单选按钮的第一行和第二行的贷款金额
  • 请将此添加到您的问题中,而不是 cmets。

标签: ruby selenium selenium-webdriver xpath capybara


【解决方案1】:

由于您正在寻找贷款标签 (Loan1) 和投资者 (Investor A) 的贷款金额,因此您可以使用下面的 XPath。

//tr[.//label[.='Loan1']]//label[.='Investor A']//preceding::label[1]
^ find a TR
    ^ that has a descendant LABEL with the loan label
                         ^ that TR has a descendant LABEL that contains the investor name
                                                ^ then go back up the DOM and find the first LABEL

这将返回“100”。

您可以在 XPath 中插入您想要的任何贷款和投资者标签,并获得您想要的任何贷款金额。

"//tr[.//label[.='#{loanLabel}']]//label[.='#{investorLabel}']//preceding::label[1]"

Ruby: Merging variables in to a string

【讨论】:

  • 感谢您提供代码。 I need to fetch the element only if the radio button next to the loan amount is selected.正如 ruhaib 建议的那样,我在 xpath 中使用了 input[@selected] 但它不起作用。
  • 据我所知,您无法使用 XPath 获取选定的元素,因为该值未反映在 HTML 中(默认值可能是但不是已选择的值)。您必须遍历所有内容,找到使用 Selenium 检查的元素,然后根据您找到的内容返回并查找元素。
  • 为什么你的帖子在@JeffC 上得到了如此多的反对?我试图修复其中的几个。
  • 好吧,它只有一个反对票。通常是一个特定的人来报复投票。你对他的帖子投了反对票并留下了建设性的批评或反馈,他对你的一些答案投了反对票。多年来一直在发生。我不时标记,他以前被禁止,但他一直这样做。我感谢大家的支持……但只有在您认为值得支持的情况下,您才应该支持,而不仅仅是因为它被否决了。
【解决方案2】:

试试这个 xpath:

//td[contains(., "Investor A")]/preceding-sibling::td[descendant::input[@selected or @checked]][1]/label/text()

【讨论】:

  • 感谢您提供 xpath。出于某种原因,如果我没有选择 [@selected] 元素。 xpath 下面给出了所有三个贷款金额 //td[contains(., "Investor A")]/preceding-sibling::td[descendant::input][1]/label/text() 是否有另一种方法获取选定的输入?
  • 我已将 xpath 更新为使用 @checked 或 @selected,但我已经尝试过,即使它们不适用于 xpath,但是如果您对基于 css 的解决方案感兴趣,则可以在 css 中使用解决方案那么请试试这个#L1_one:checked。如果这对你有用,我会将上面的 xpath 转换为 css。
  • 我会尝试使用css,能否请您提供等效的css
【解决方案3】:

此处的示例如何获取单选按钮取决于贷款标签和价值:

//tr[.//label[.='Loan1']]//td[./label[.='100']]/input
//tr[.//label[.='Loan1']]//td[./label[.='300']]/input

//tr[.//label[.='Loan2']]//td[./label[.='100']]/input

//tr[.//label[.='Loan3']]//td[./label[.='200']]/input

【讨论】:

    【解决方案4】:

    如果单选按钮的选择状态在加载 HTML 后发生了变化,那么您尝试执行的操作对于 XPath 是不可能的。这是因为 XPath 无法访问反映当前状态的输入属性(它只能访问属性)。您还有一个问题,即没有一个

    输入[id$="_one"]:checked + 标签

    因为你想要 CSS 会找到的标签元素的文本,并且你表明你正在使用 Capybara,所以它会是

    texts = all(:css, 'input[id$="_one"]:checked + label').map(&:text)
    

    注意:这实际上并没有使用文本“投资者 A”来查找您感兴趣的元素。如果 id 不可靠并且使用“投资者 A”文本很重要,则无法使用具有 HTML 结构方式的单个 XPath 或 CSS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 2016-03-12
      相关资源
      最近更新 更多