如何从参考通过xpath从多个类中选择的其他元素标识的元素中提取属性

时间:2018-04-05 13:21:36

标签: python selenium selenium-webdriver xpath webdriver

我在尝试从班级中选择数据时遇到问题。我需要做的是获取每个类的第三个TD(报告名称)(名为"奇数"或"偶数"),然后将其与python中的字符串变量进行比较(其中是提交报告的名称,例如"报告名称2(擦除)"),如果匹配,我需要获取第一个td的值。我只需要能够在第三个td中使用该报告名称获取该数字。有任何想法吗?我尝试了像

这样的CSS选择器
driver.find_element_by_xpath("//table[contains(@class, 'data') and contains(., 'Name of Report 1 (scrubbed)')]")

但是我一直把垃圾放到python中的字符串var中。谢谢!

<tr class="odd">
<td style="text-align: center; width: 25px;"><input type='checkbox' name='report' value='4933047'/></td>
<td style="text-align: center; width: 65px;"><a href="#" onclick="getReportDetails('4933047')">4933047</a></td>
<td>Name of Report 1 (scrubbed)</td>
<td></td>
<td style="text-align: center; width: 60px;">'PRO_DET'</td>
<td style="text-align: center; width: 65px;">2018-05-19</td>
<td style="text-align: center; width: 95px;">2018-04-04</td>
<td style="text-align: center; width: 60px;">Complete</td></tr>
<tr class="even">
<td style="text-align: center; width: 25px;"><input type='checkbox' name='report' value='4933041'/></td>
<td style="text-align: center; width: 65px;"><a href="#" onclick="getReportDetails('4933041')">4933041</a></td>
<td>Name of Report 2 (scrubbed)</td>
<td></td>
<td style="text-align: center; width: 60px;">'PRO_DET'</td>
<td style="text-align: center; width: 65px;">2018-05-19</td>
<td style="text-align: center; width: 95px;">2018-04-04</td>
<td style="text-align: center; width: 60px;">Complete</td></tr>

2 个答案:

答案 0 :(得分:0)

好的,所以我不是python专家,主要做C#,但是让我试一试,看看它是否对你有帮助。

假设你总是需要tr下的第三个td,你需要做的第一件事是创建一个tr的对象。由于行数很多,您将不得不进行循环。

tableRow = driver.find_elements_by_xpath("//tr")

这将返回一个表行的元素列表(假设这些是页面上的唯一行)。现在,对于你想获得第三个td元素的每一行,对吗?你只想对奇数或偶数的行做这个吗?

所以你在列表上做了一个for循环。

for el in tableRow:

    thirdColumn = el.find_element_by_xpath("(//td)[3]")
    thirdColumnText = thirdColumn.text


    if "yourtext" in thirdColumnText:

      firstColumn = el.find_element_by_xpath("(//td)[1]")

      firstColumnInput = firstColumn.find_element_by_xpath("//input")
      firstColumnInputValue = firstColumnInput.get_attribute("value")

    //here you can assert if the firstColumnInputValue contains thirdColumnText

然后您可以根据需要使用第一列的值。

所以要解释一下我们在做什么,简而言之:

  • 首先我们创建tableRow(有奇数或偶数类)
  • 然后对于每个tableRow,我们首先检查第三列的文本。
  • 如果第三列的文本包含您的python变量
  • 我们正在获取第一列
  • 中的value属性
  • 一旦我们有后者,我们将检查此值是否包含第三列的值。我不知道它们是如何格式化的,但你应该能够解决这个问题。

答案 1 :(得分:0)

根据提供的HTML获取每个类奇数甚至的第三个<td>节点,然后将其与字符串变量进行比较,如果匹配要获取第一个td的值,您可以编写一个函数并传递 String 以进行匹配,如下所示:

def test_me(myString):
    myList = driver.find_elements_by_xpath("//tr[@class='odd' or @class='even']//following-sibling::td[3]")
    for item in myList:
        if item.text == myString:
            print(item.find_element_by_xpath(".//preceding::td[2]/input").get_attribute("value"))

更新

根据你的反问题,这里有详细信息:

xpath 中的

following-sibling关键字:

  • 示例:

    (“//*[@class=’o2-app-header’]//following-sibling::a”)
    
  • 描述:该技术用于定位特定节点的兄弟元素。

  • 说明:xpath表达式使用“// * [@ class ='o2-app-header']”获取元素的所有兄弟元素。
xpath 中的

preceding关键字:

  • 示例:

    (“//body/preceding::*”)
    
  • 描述:该技术用于定位特定元素的所有前面元素。

  • 说明:xpath表达式返回BODY标记中的所有前面的元素。