【问题标题】:Selenium: Find an element stored in a containerSelenium:查找存储在容器中的元素
【发布时间】:2019-05-11 23:57:22
【问题描述】:

我正在使用 Selenium 来自动化流程。到目前为止,我已经成功地在这里找到了我需要的东西,但是找不到找到这个元素的方法:

<a href="javascript:void(0);" onclick="AUL.update('AssignedAssetsUpdateContainer', {}, '13.7.25.0.0.0.0.2.3.0.0.1.2.0.3.0.1.5.3.3.0.1.3.1.5.0.0.1.2.9.5.1.19.0.1.3.1');">
123456
</a>

我首先尝试通过搜索所有标签来查找它:

assetElements = driver.find_elements_by_tag_name("a")
for element in assetElements:
     if(element.text == "123456")
          element.send_keys(Keys.RETURN)

我选择这条路线显然是因为href标签,但它告诉我它在页面上找不到元素。我认为这是因为页面正在查询数据库并将其填充到容器中。

Butttt.... 完全出于寻找它的动力,我采用了在 https://selenium-python.readthedocs.io/api.html# 上找到的其他 find_elements 选项,并在可用的地方打印了它们的 .text 段,但无法找到它。

欢迎任何想法。这是我第一次在网站上发帖,所以我希望我没有错过任何内容。

这是我试图定位的字段的图像,它是一个搜索响应:

搜索字段容器响应

为了展示,这里是找到其他条目但不是“123456”的 CSS 响应

CSS_Selector 响应

添加了显示搜索元素的结果的屏幕截图

找到元素@JeffC 的屏幕截图

【问题讨论】:

  • 您是通过链接文本还是部分链接文本尝试的?您还可以使用像//a[.='123456']//a[contains(.,'123456')] 这样的XPath。你也可以试试 CSS 选择器,a[onclick*='AssignedAssetsUpdateContainer']
  • 我确实尝试了 find_elements_xpath 并且我没有返回任何结果,使用 CSS 选择器将返回列表中的其他条目,除了容器中的“123456”。 @JeffC
  • 您尝试添加等待吗?等待页面上最后加载的内容。然后再次尝试定位器。您应该尝试等待页面加载,然后在浏览器控制台中将$$() 用于CSS 选择器,将$x() 用于XPath...然后找到它们吗?
  • 嘿@JeffC 谢谢你的时间和回复,我实际上不熟悉使用浏览器控制台。我刚刚尝试过,“//a[contains(.,'123456')]”确实发现它没有问题。 assetNumberElement = driver.find_element_by_xpath("//a[contains(.,'123456')]") 返回 selenium.common.exceptions.NoSuchElementException: 消息:没有这样的元素:无法找到元素:{"method":"xpath" ,"选择器":"//a[包含(.,'123456')]"}
  • 开发工具面板可以使用 F12 打开。从那里,打开控制台并输入命令,例如$$("a[onclick*='AssignedAssetsUpdateContainer']") 作为示例 CSS 选择器或 $x("//a[.='123456']") 作为示例 XPath。在 Chrome 控制台here 上查看更多帮助,尤其是命令行参考页面。

标签: python selenium selenium-webdriver xpath webdriverwait


【解决方案1】:

所需元素是启用了JavaScript 的元素,因此要在元素上调用click(),您必须诱导WebDriverWait 以使元素可点击 并且您可以使用以下解决方案:

  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@onclick,'AssignedAssetsUpdateContainer') and normalize-space()='123456']"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2017-12-03
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多