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

Python Selenium单击页面动态加载后加载的元素?

戴化
2023-03-14

我使用Python 3和Selenium来自动化浏览器活动。在我正在工作的页面上,我有一个按钮,当点击时,它会加载一个下拉菜单。然而,在检查时,我相信下拉框是在点击按钮后生成的,因为我没有看到页面加载菜单的html。

我正在使用以下代码

driver.get(path)
sleep(1)
try:
    driver.find_element_by_id("DROPDOWN").click()
    sleep(8)
    driver.find_element_by_xpath('//button[text()="Account"]').click()
    print("button clicked")
except:
    print("no button to click")
sleep(1)
browser.quit()

html

<button class="_19rM-p " id="DROPDOWN">
    <i class="_F-AgkVkVa  icon icon-menu"></i>
    <span class="_2Q7bh">Menu</span>
</button>

这个菜单大概是通过JS加载的,我试图点击的按钮是文本帐户

<div class="_2ID5Vy" role="menu">
    <div class="_2ID5Vy">
        <div class="_2pcjK9c" style="display: block;"></div>
        <div><span class="_4cdfLigUWzeeVcPzzbe78">User Menu</span></div>
    </div>
    <div class="_49I5s">
        <button role="button" class="_2s6F0RequP0">Account</button>
    </div>
<div>

这将加载网站,并单击下拉菜单。我在下拉菜单中看到按钮加载,我正试图让浏览器单击该按钮,但它从未单击过。我不确定这是什么原因造成的。可能是在页面加载之后添加了html。

单击按钮我可以做什么?

谢谢

编辑更新的代码以包含html。

共有1个答案

冀啸
2023-03-14

时间。您使用的睡眠可能不够有效。添加显式等待。对于此导入:

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

用这种方式:

driver.find_element_by_id("DROPDOWN").click()
account_btn = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[text()="Account"]")))
account_btn.click()
print("button clicked")

此外,您还可以尝试使用CSS选择器单击。对于此按钮,其选项之一为:_2S6F0REQUP00

account_btn = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "._2s6F0RequP0")))
account_btn.click()

记住,定位器必须是唯一的。在您的html代码中,您的定位器是唯一的,但您正在查看的页面上可能有更多带有此类文本的按钮。

 类似资料:
  • 当我运行以下代码时,执行会突然结束,除非我取消对Thread.sleep()的注释。因此,我在撤回url servlet中的代码不会被执行。单击是一个提交按钮单击,加载另一个页面。 让硒等到页面加载的正确方法是什么? 我正在使用以下selenium版本

  • 问题内容: 我正在构建Java Web应用程序,并且我讨厌传统的“代码-编译-部署-测试”周期。我想输入一个微小的更改,然后立即查看结果,而无需编译和部署。 幸运的是,码头很适合这样做。这是一个纯Java Web服务器。它带有一个非常不错的maven插件,可让您直接从构建树中启动Jetty阅读- 无需打包war文件或部署。它甚至具有scanInterval设置:将其设置为非零值,它将监视您的Jav

  • 问题内容: 我有一个页面,其中包含2个控制器:一个管理一个所谓的“应用程序”列表,另一个将新的Angular模板放入其Div元素的innerHTML中。 我尝试使用标准的{{expression}}绑定,但是它们不适用于html,我也尝试了ng-bind-html- unsafe指令(将innerhtml绑定到App请求的返回值),但是控制器不支持在此新代码中执行。 问题似乎在于,通过使用绑定,A

  • 我最近用python和Selenium做了一个webscraper,我发现做起来非常简单。页面使用ajax调用加载数据,最初我等待一个固定的time_out加载页面。有一段时间奏效了。之后,我发现selenium有一个内置函数WebDriverWait,它可以使用wait.until()等待特定元素的加载。这使我的webscraper运行得更快。 问题是,我对结果还是不满意。我下载内容平均每页花了

  • 问题内容: 有人知道如何等待页面加载吗?我尝试了在网上找到的所有可能的变体,但根本无法正常工作。 触发click()命令后,我需要等待,Web服务器上存在一些内部脚本,这些脚本会愚弄检查,例如(我排除了导入所需模块并使用标准命名约定的代码): 要么 要么 上述所有检查均无效,从某种意义上来说,即使页面仍在加载中,它们也会返回True。这会导致我正在阅读的文本不完整,因为click()命令后页面未完

  • 问题内容: 这有点难以解释,所以我会尽力而为 因此,在加载HTML页面时,我希望有一个很酷的加载屏幕在显示。完成加载后,我希望清除加载屏幕并显示HTML文档。 基本上,我想要这样: CSS: HTML: 页面加载时发生的情况。当页面加载时,将被清除,并显示HTML文档的其余部分。(我正在建立一个学分系统,虽然学分加载时我真的很需要它来说它正在加载,但是人们抱怨他们无法单击任何东西,我不得不告诉他们