【问题标题】:Element is visible but cannot be found by webdriver元素可见但 webdriver 找不到
【发布时间】:2019-10-06 13:51:09
【问题描述】:

我正在使用 selenium 和 python 进行自动化测试,但在尝试单击 web 中的元素时遇到问题。

我正在使用 find_element_by_xpath,提供正确的路径(我在浏览器上尝试过,它返回 1 of 1)。

driver = webdriver.Chrome()
driver.get('page_url')
driver.find_element_by_xpath(//button[@class="aoc-end md-button md-ink-ripple"])

这里是html:

<div class="_md md-open-menu-container md-whiteframe-z2 md-active md-clickable" id="menu_container_77" style="top: 499px; left: 866px; transform-origin: right top;" aria-hidden="false">
 <md-menu-content class="agent-dropdown-menu-content new-menu-content" width="3" role="menu"><!----><md-menu-item>
    <button class="aoc-end-work md-button md-ink-ripple" type="button" ng-transclude="" ng-disabled="!agent.capabilities.canSupervisorLogout" ng-click="logOutAgent(agent.userHandle)" role="menuitem">

应该找到元素,但实际结果是 selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

【问题讨论】:

  • 您是否手动向下或向上滚动以查看该元素?
  • 该元素在打开下拉列表时可见,无需滚动查看
  • 你能分享下拉的HTML代码吗?
  • 我的猜测是,与该定位器匹配的元素不止一个,并且第一个可用的元素不可见。检查您的定位器并更新问题。请发布有效/完整的 HTML。您现在获得的 HTML 不完整,并且没有以易于阅读的形式格式化。

标签: python selenium selenium-webdriver pytest


【解决方案1】:

从例外情况来看,该元素似乎存在于页面中,但当前不可见。 元素不可见的可能原因可能是(元素被另一个元素掩盖,元素可以在下拉列表中等)。如果元素在下拉列表中,则首先打开列表,然后找到该元素。

希望它会有所帮助。

【讨论】:

  • 谢谢。该元素在下拉列表中,所以我之前打开了下拉列表,但该元素仍然不可见
  • 您可以使用外部等待并等到元素可见(已经有预定义的方法)。所以你最好的选择是:1)打开下拉列表 2)应用外部等待条件等待元素可见
  • 我尝试每 5 秒扫描一次元素,但 1 分钟后仍然找不到
  • 好的,另外一种情况是,如果您要选择的元素当前在下拉列表中不可见,您可能需要滚动到下拉列表中。让我们看看这是否有帮助。
【解决方案2】:

在以 Angular 开发的 Web 应用程序中查找定位器非常棘手,尤其是当开发人员不遵循任何从自动化角度来看有用的准则时,例如为每个 Web 元素添加唯一属性等...

在您的情况下,似乎正在发生同样的事情。

以下定位器应该适合您(顺便说一下,您在 driver.find_element_by_xpath() 方法中错过了定位器前后的“”):

driver.find_element_by_xpath("//button[@ng-click='logOutAgent(agent.userHandle)']");

【讨论】:

    【解决方案3】:

    由于您尝试点击的元素是动态元素,因此您需要等待它变为可点击后才能点击它。使用预期条件和 WebDriver 等待:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    element = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@class='aoc-end md-button md-ink-ripple']"))).click()
    

    另外,请注意外部和内部 xpath 选择器上的 " "' ' 引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2015-05-03
      相关资源
      最近更新 更多