gorollcri 2024-05-13 16:32 采纳率: 33.3%
浏览 4
已结题

selenium无法定位页面中动态元素

我在检查源代码的时候发现目标源代码是以js检测鼠标悬停才会post在f12开发者工具中,在不悬停情况下这段代码是不存在的

<----!>

这样就导致by没法直接定位到我需要的代码块,也就无法获得相应信息(我需要的信息是在悬停后弹出的窗口div中)
已知可以通过动作链模拟悬停使出现,但我需要的目标太多了,有很多地方需要悬停获取,这样子mouseover能把我写晕了
有没有别的办法?

  • 写回答

4条回答 默认 最新

  • 笑面虎 2024-05-13 16:32
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】:您想要解决的问题是如何在使用Selenium进行自动化测试时,定位并获取那些只有在鼠标悬停后才会出现的动态元素。

    【问题出现原因】:这个问题出现的原因是动态元素在页面的初始HTML源代码中并不存在,它们是在用户与页面交互(如鼠标悬停)后才通过JavaScript动态生成的。因此,使用传统的Selenium定位方法(如CSS选择器、Xpath等)在元素未生成前是无法找到这些元素的。

    【问题解决方案】:针对这个问题,有几种可能的解决方案:

    1. 使用Selenium的动作链(ActionChains):您已经提到了这个方法,它可以用来模拟用户的鼠标悬停行为,从而触发动态元素的生成。虽然这个方法有效,但如果需要悬停的目标很多,确实会比较繁琐。

    2. 使用JavaScript执行器:Selenium的WebDriver提供了一个JavaScript执行器,您可以直接通过它来执行JavaScript代码,而不必模拟用户的鼠标悬停。例如:

      driver.execute_script("arguments[0].style.display='block';", element)
      

      这段代码可以将一个元素的显示属性设置为block,从而可能触发动态内容的加载。

    3. 等待元素出现:在使用动作链或JavaScript执行器后,您可以使用Selenium的等待机制来等待动态元素出现。例如使用WebDriverWaitexpected_conditions

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      wait = WebDriverWait(driver, 10)
      dynamic_element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "your-css-selector")))
      

    【提供代码】:以下是一个使用JavaScript执行器和等待机制的示例代码:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("your-url")
    
    # 假设您已经找到了触发动态元素的元素
    trigger_element = driver.find_element(By.CSS_SELECTOR, "trigger-element-css-selector")
    
    # 使用JavaScript执行器来模拟鼠标悬停
    driver.execute_script("arguments[0].style.display='block';", trigger_element)
    
    # 等待动态元素出现
    dynamic_element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, "dynamic-element-css-selector"))
    )
    
    # 现在您可以对动态元素进行操作了
    

    【代码运行方式】:运行这段代码需要有Python环境,并且安装了Selenium库和对应的WebDriver(如ChromeDriver或GeckoDriver)。您需要将"your-url"替换为您要测试的网页的URL,将"trigger-element-css-selector""dynamic-element-css-selector"替换为实际的CSS选择器。

    【代码预期运行结果】:代码将打开一个浏览器窗口,导航到指定的URL,模拟鼠标悬停在触发元素上,等待动态元素出现,然后您可以对动态元素进行进一步的操作。

    【推荐相关链接】:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月7日
  • 已采纳回答 5月30日
  • 创建了问题 5月13日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆