硒使用xpath查找元素

时间:2019-08-20 11:32:07

标签: ruby selenium selenium-webdriver xpath capybara

我需要为投资者A查找具有贷款金额的元素(在本例中为100,100)

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

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

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

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

但是我只需要从第一行和第二行选择了单选按钮的借出金额

enter image description here

<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>

4 个答案:

答案 0 :(得分:1)

尝试此xpath:

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

答案 1 :(得分:0)

在此示例中,如何获得单选按钮取决于贷款标签和值:

//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

答案 2 :(得分:0)

由于您要根据给定的贷款标签(Loan1)和投资者(投资者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

答案 3 :(得分:0)

如果自从HTML加载以来,单选按钮的选择状态已更改,则XPath将无法执行您要执行的操作。这是因为XPath无法访问反映当前状态的输入属性(它只能访问属性)。您还遇到一个问题,即

input [id $ =“ _ one”]:选中+标签

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

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

注意:这实际上并不使用文本“ Investor A”来查找您感兴趣的元素。如果ID不可靠,并且使用“ Investor A”文本很重要,则无法使用单个XPath或CSS以及HTML的构造方式。