【问题标题】:Selenium Python Get data from Table rowsSelenium Python 从表格行中获取数据
【发布时间】:2021-08-21 18:27:34
【问题描述】:

我有如下所示的列:

这些列数据以 div 形式显示,而不是屏幕截图中显示的表格。

我的问题是如何从这些 div 中仅获取特定的列值。例如,我只想获取 Carrier Name 列的值。

【问题讨论】:

    标签: selenium automation pytest qa


    【解决方案1】:

    有几种方法可以实现它:

    • Brutal Way。 使用下面的大 XPath 可以帮助您通过名称识别特定列的所有值。例如,这个从“电话”列中找到所有值:
      //div[contains(@class,'TableBody')]//div[contains(@class,'RowInfo')]//div[count(//div[text()='Phone']/preceding-sibling::*) + 1]
      

      为了让你不那么害怕,这里有一个细分:

      1. XPath 背后的逻辑是获取特定列的索引(例如“电话”)并进一步使用它检索适当的行强>。我们找到 div 元素,该元素包含 文本等于列名。 然后使用 count() 函数获取在同一层次结构中当前元素之前的兄弟 div 元素的数量;并加 1 得到最终索引:

      count(//div[text()='Here_goes_column_name']/preceding-sibling::*) + 1

      1. 之后,我们从表格主体中获取所有行元素,并只获取与检索到的索引匹配的单元格 在上一步中:

      //div[contains(@class,'TableBody')]//div[contains(@class,'RowInfo')]//div[<XPath_from_previous_step>]

    • 更优雅的方式。您可以在 Python 代码中创建一组类似常量的变量(用大写字母命名)(例如在同一个类中,这样更容易)访问),每个都保留适当列的索引。例如,
      DATE_COLUMN_INDEX = 1
      CARRIR_NAME_COLUMN_INDEX = 2
      PHONE_COLUMN_INDEX = 3
      ...
      

      然后在你的代码中使用它,像这样:

      base_xpath = "//*[contains(@class,'TableBody')]//*[contains(@class,'RowInfo')][{}]"
      dates = driver.find_elements_by_xpath(base_xpath.format(DATE_COLUMN_INDEX))
      

    结论:使用后一种方法将帮助您的测试减少对潜在 UI 更改的依赖,并且不会用非常大的 XPath 污染您的代码库。最后,让您的测试更稳定,更不易出错。

    【讨论】:

      【解决方案2】:

      试试这个:

      carrier_names = driver.find_elements_by_xpath('//div[contains(@class,'TableBody')]//div[contains(@class,'fcuTEs')]')
      

      如果这不起作用,试试这个:

      carrier_names = driver.find_elements_by_xpath('(//div[contains(@class,'TableBody')]//div[contains(@class,'RowInfo')])[2]')
      

      不要忘记在此之前添加一些延迟/等待以让页面完全加载

      【讨论】:

      • 您好,谢谢。有效。我的下一步是从所有这些列中获取文本。该怎么做?
      • 我认为如果你在这里接受我的回答并为此提出一个新问题会更好。
      猜你喜欢
      • 2020-04-02
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多