我正在寻找一种更好的方法来编写没有索引的XPath

问题描述 投票:0回答:2

我正在尝试为下面的 HTML 编写 XPath。

<div class="oxd-table-card" data-v-f2168256="">
  <div class="oxd-table-row oxd-table-row--with-border" role="row" data-v-0d5ef602="" data-v-f2168256="">
    <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 40%;">
      <div data-v-6c07a142="">aaaaa Collings</div>
    </div>
    <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 40%;">
      <div data-v-6c07a142="">2023-10-02 - 2023-10-08</div>
    </div>
    <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 20%;">
      <div class="oxd-table-cell-actions" data-v-c423d1fa="">
        <button type="button" class="oxd-button oxd-button--medium oxd-button--text oxd-table-cell-action-space" data-v-10d463b7="" data-v-c423d1fa="">
          <!----> View
          <!---->
        </button>
      </div>
    </div>
  </div>
</div>

我想要实现的目标:

  1. XPath 从获取文本开始

    <div data-v-6c07a142>aaaaa Collings</div>
    
  2. 然后移至父标签

    <div class="oxd-table-cell oxd-padding-cell" role="cell" style="flex: 1 1 40%;">
    
  3. 然后移动到下一个同级并从中获取文本值

    <div data-v-6c07a142>2023-10-02 - 2023-10-08</div>
    

网站:https://opensource-demo.orangehrmlive.com/web/index.php/auth/login 登录后,这是左侧菜单中的“时间”部分。我正在尝试获取时间模块中表的 XPath。

到目前为止我已经能够使用 XPath 获取文本

(//div[text()='aaaaa  Collings']/parent::div/following-sibling::div)[1]

我想知道是否可以在不使用 XPath 中的索引的情况下获取文本。

selenium-webdriver xpath
2个回答
0
投票

我认为你的 XPath 没问题。这可能已经是最好的了。在这种情况下不需要索引,因为它是返回的第一个元素。你可以直接使用,

//div[text()='aaaaa  Collings']/parent::div/following-sibling::div

使用FindElement(单数),它将拉出第一个(所需的)元素。


0
投票

我刚刚查看了您的网站。如果你想自动化测试,你可以获取表行中的所有数据,你可以使用Selenium方法FindElements

//Locate Table
IWebElement table = driver.FindElement(By.XPath("//div[@class='oxd-table']"));

//Locate Rows using *FindElements*
IList<IWebElement> rows = table.FindElements(By.XPath("//div[contains(@class, 'oxd-table-card')]"));

这样您将获得所有数据并使用 for 循环:

  foreach (var row in rows)
 {
     // Find all cells in the row
     IList<IWebElement> cells = row.FindElements(By.XPath(//div[contains(@class, 'oxd-table-row')]));
  
     // Create a list ***rowData*** to store row's data in cells and process
     
     // Extract text from each cell and add to rowData
     foreach (var cell in cells)
     {
       rowData.Add(cell.Text;));
       // process data in list according to your needs...
     }
    }
© www.soinside.com 2019 - 2024. All rights reserved.