当前位置: 首页 > 知识库问答 >
问题:

Selenium从整个页面中找到元素,而不仅仅是其中的一部分(Python)

司英彦
2023-03-14

我有这样一个html元素:

<table>
   <tbody>
      <tr>
         <td>My Text</td>
         <td>Some Other Text</td>
         <td><img src="../delete.png" alt="trashcan"></td>
      </tr>
      <tr>
         <td>More Text</td>
         <td>Some More Text</td>
         <td><img src="../delete.png" alt="trashcan"></td>
      </tr>
   </tbody>
</table>

我想按文本行找到一个表格,然后单击垃圾桶图标将其删除。

所以我的想法是循环行<代码>

tbody = driver.find_element_by_tag_name("tbody")
tr = tbody.find_elements_by_tag_name("tr")
for row in tr:
   td = row.find_elements_by_tag_name("td")
   print(len(td))
   for cell in td:
     if cell.text == "More Text":
       delete = row.find_element_by_xpath('//img[@alt="trashcan"]')
       delete.click()

我的理解是,驱动程序是整个页面tbody就是该页面中的tbody元素。因此,无论我试图从那里找到什么,都必须是该元素的子元素。为了确认,我打印出td元素的长度,该元素打印出“3”。

删除按钮删除=行。通过xpath(“//img[@alt=“trashcan”]”)查找\u element\u从第一行而不是第二行选择删除按钮。

我也试过了

delete = row.find_elements_by_xpath('//img[@alt="trashcan"]')
delete[0].click()

但它也选择行。

只是为了确保我打印出了if条件下的行(print(row.get_attribute("innerHTML")),它打印出了第二行。

知道发生了什么或者我如何选择第二行中的img吗?

共有3个答案

邹坚壁
2023-03-14

您可以尝试更改for循环。与范围(1,len(tr))中的i类似:它跳过第一个。或者您可以在for循环之前弹出tr中的第一个元素

阎功
2023-03-14

xpath只会为您提供它找到的第一条路径。

我不确定您对JavaScript有多熟悉,但我倾向于使用css\u选择器查找元素。它允许您在运行文档时输入相同的参数。querySelectorAll(查询选择全部)。

在您的情况下,您可以这样做:

text_to_find = 'If this is spotted, then delete'
# Find all tds
trs = driver.find_elements_by_css_selector("td")
# Iterate over each tr insde a td.
for tr in trs:
    for td in tr.find_elements_by_css_selector('tr'):
        # If any td text is equal to the text you wish to delete, then click on the trashcan and then move onto the next td.
        if td.text == text_to_find:
            tr.find_element_by_css_selector("[alt='trashcan']").click() # notice that I removed the 's' in elements.
            break
应涵容
2023-03-14

使用text()方法可以找到正确的XPath,如下所示:

//td[contains(text(),'Some More Text')]/../td[3]

或:

//td[contains(text(),'Some More Text')]/parent::tr/td[3]

第一个只是上升一级,然后寻找第三个td元素。

第二种方法看起来像父元素,就像这里描述的XPath:从子节点获取父节点。

尝试将其应用到您的循环中。

 类似资料:
  • 我试图自动化YouTube搜索,点击搜索结果,然后跟随右侧的推荐视频。我写的代码进入youtube,进行搜索,点击视频,视频就会在浏览器上打开。但是,我不能带它点击其中一个推荐的视频。 问题似乎在于,当我使用从右边获取推荐视频元素的列表时,我得到的是上一页的列表(当我第一次输入单词并获得搜索结果时)。 当我使用直接转到视频链接时,代码确实可以正常工作,而不是先进行搜索。 所以当我点击(最后一行)时

  • 我对在Selenium中使用python还很陌生。

  • 我想运行一个selenium测试,当单击旧页面中的按钮时,它是否导航到新页面。然后我想测试当新页面中的按钮被点击时,它是否导航回旧页面。 当我单击第一页上的按钮并检查新页面上的按钮元素是否出现时,测试工作正常。但是当我使用selenium点击第二页上的button元素,检查第一页上的button元素是否已经出现时,它没有找到第一页上的button元素,尽管我第一次使用相同的button元素去第二页

  • 我遇到了这种奇怪的情况。 > 我首先在第1页,它有一个id为“abc”的元素,我使用“abc”查找webElement并获得它的文本值 我点击了第1页的一个链接,它把我带到了第2页 值得注意的是,如果在页面切换之间插入硬编码延迟(线程Hibernate等),就不会出现过时的问题。 谢谢,

  • 当我在wordpress页面上显示一些产品时,我想显示一个简短的描述链接到一个相关的pdf(理想情况下使用pdf图标作为链接) 我已经设法通过使用以下代码来显示简短的描述-但是我如何在已经添加到产品中的元数据中添加一些东西(元数据:pdf_link)-它是一个. pdf文件的网址 添加动作(“购物”后加上“购物”后加上“购物”后加上“购物”后加上“购物”后加上“购物”后加上“购物”后加上“购物”后

  • 我有一个html页面和一个带有Thymeleaf模板引擎的java应用程序,我正在寻找一个教程,向服务器发出请求,并根据响应仅呈现页面的一部分。 此时,我有一些按钮具有相同页面的链接,带有不同的参数,我的div是基于属性文章列表创建的(我从服务器接收基于button_id) 超文本标记语言: Java: 我希望我的按钮处理我的索引控制器,只更改文章的div,而不是刷新整个页面。 我尝试过使用aja