在 Selenium 中找不到更改 ID 的按钮

软件测试 路径
2022-02-05 23:34:41

我正在做一个项目,我必须找到一个按钮。我为此使用了 XPath,但是每次刷新时按钮的 id 都会发生变化,所以我遇到了一个问题。以下是 HTML 摘录。让我知道如何识别该按钮,以便即使 id 更改也不会导致错误

<tr>
  <td/>
  <td>
    <div id="LoginButton" style="float: left;">
      <table style="width: auto;" id="ext-comp-1032" class="x-btn x-btn-noicon x-btn-over x-btn-focus" cellspacing="0">
        <tbody class="x-btn-small x-btn-icon-small-left">
          <tr>
            <td class="x-btn-tl">
              <i>&nbsp;</i>
            </td>
            <td class="x-btn-tc"/>
            <td class="x-btn-tr">
              <i>&nbsp;</i>
            </td>
          </tr>
          <tr>
            <td class="x-btn-ml">
              <i>&nbsp;</i>
            </td>
            <td class="x-btn-mc">
              <em class="" unselectable="on">
                <button class=" x-btn-text" id="ext-gen12" type="button">Login</button>
              </em>
            </td>
            <td class="x-btn-mr">
              <i>&nbsp;</i>
            </td>
          </tr>
          <tr>
            <td class="x-btn-bl">
              <i>&nbsp;</i>
            </td>
            <td class="x-btn-bc"/>
            <td class="x-btn-br">
              <i>&nbsp;</i>
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </td>
</tr>
4个回答

如果按钮上方有一个唯一可识别的元素,则您只能在该范围内搜索,假设该按钮是该范围内的唯一按钮。您还可以尝试部分匹配按钮 id(不确定是整个更改,还是仅部分更改)或匹配按钮的类(如果它没有更改)。如果无法识别唯一的父级或祖先(我不知道,因为您没有提供整个 html),您可以先找到<div id="LoginButton">,然后从那里返回 3 个级别,然后找到该下的按钮. XPath 看起来像这样:

//div[@id="LoginButton"]/../../../button

如果您已经为此使用 XPath,您是否可以更早地启动您的 XPath,例如,从它看起来好像在其中的表中启动 XPath。

如果您总是有 2 个(如您的示例中的ext-gen11和),这也将起作用:ext-gen12

//button[text()="Login"][1]ext-gen11
//button[text()="Login"][2]ext-gen12

但取决于其他(更可靠的)元素,可能是一个更好的主意。
如前所述:

//div[@id="LoginButton"]/../../../button[text()="Login"]ext-gen11
//div[@id="LoginButton"]//button[text()="Login"]ext-gen12

您可以尝试将所有按钮值放入一个数组中,然后选择您需要的任何一个。在 Selenium API 中getAllButtons(),我们有可以获取所有按钮 ID 的方法。将其存储到数组中

String allbuttonIds [] = selenium.getAllButtons();

然后通过索引访问您想要的按钮。