首页 > 其他分享 >关于shadow-root影子控件的selenium ui自动化

关于shadow-root影子控件的selenium ui自动化

时间:2024-08-28 10:36:54浏览次数:17  
标签:控件 driver 元素 selenium ele ui shadow root

首先这个控件和iframe有异曲同工之妙,也是嵌套的一个html,所以定位不能像普通定位一样

下面实践一下

首先准备一个root.html

<!DOCTYPE html>
<html>
<head>
  <title>带有shadow-root的页面</title>
</head>
<body>
  <h1 class="test">带有shadow-root的页面</h1>

  <template id="shadowRootTemplate">
    <style>
      /* 在shadow root中定义样式 */
      .message {
        color: blue;
        font-size: 18px;
      }
    </style>
    <div class="message">
      这是一个带有shadow-root的页面。
    </div>
  </template>

  <script>
    // 获取template元素
    const template = document.querySelector('#shadowRootTemplate');

    // 在<body>中创建shadow root
    const shadowRoot = document.body.attachShadow({ mode: 'open' });

    // 将template内容复制到shadow root中
    const templateContent = template.content.cloneNode(true);
    shadowRoot.appendChild(templateContent);
  </script>
</body>
</html>

这里偷个懒,使用python http服务启动一个临时的页面

python -m http.server

成功之后访问 http://localhost:8000/root.html

这样我们就具备了一个临时测试用的页面了

正题

首先 selenium 给元素对象提供了一个shadow_root的方法

我们先来定位到shadow-root元素的父级节点

driver.find_element(By.TAG_NAME, 'body')

然后根据父级节点的元素对象找到该元素下面的shadow-root

root_ele = driver.find_element(By.TAG_NAME, 'body')

ele = root_ele.shadow_root

此时,我们就可以使用ele元素对象去定位ele元素对象下的元素

例如:

ele.find_element(By.CSS_SELECTOR, '.message').get_attribute('innerText')

这样就可以对元素进行操作了

完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Edge()
driver.get('http://localhost:8000/root.html')
driver.implicitly_wait(10)
# 定位shadow-root的父元素
root_ele = driver.find_element(By.TAG_NAME, 'body')
# 获取shadow-root对象
ele = root_ele.shadow_root
# 使用css 定位 shadow-root 下的元素
print(ele.find_element(By.CSS_SELECTOR, '.message').get_attribute('innerText'))

转自:https://ceshiren.com/t/topic/26345

标签:控件,driver,元素,selenium,ele,ui,shadow,root
From: https://www.cnblogs.com/leafautumn/p/18384125

相关文章

  • pygame封装连个常用控件
    #coding=utf-8importos,sys,re,timeimportpygameimportrandomfromwin32apiimportGetSystemMetricsfromtkinterimportmessageboxpygame.init()pygame.display.set_caption("我的控件")percent=0.6screen_width=GetSystemMetrics(0)screen_heig......
  • BuildContext 是什么
    在 Flutter 中 BuildContext 可太常见了,不管是 StatelessWidget 还是 StatefulWidget 的 build() 函数参数都会带有 BuildContext,好像随处可见,就像我们的一位老朋友,但似乎又对其知之甚少(熟悉的陌生人),今天我们再来了解一下这位老朋友 BuildContext,看看它在 Flutter ......
  • 最强图像反推Joy_Caption结合ComfyUI Flux GGUF的使用
    前言前言对于图像的提示词反推,大家不都陌生,最开始使用的WD14反推,到我之前写的文章[Flux超强图像提示词伴侣MiniCPM-V2.6(超强)|ComfyUI中Flux实现无IPA三图创意融合]反推的效果都在增强,今天再给大家推荐一款,号称最强提示词反推工具:JoyCaption,在ComfyUI中的安装,以及结合......
  • [ARC062E] Building Cubes with AtCoDeer
    题意给定\(n\)个正方形,每个正方形的四个角有颜色,有方向。你需要选出\(6\)个正方形,拼出一个正方体,使得角上的颜色相同。问有多少种方案。\(n\le400,m\le1000\)Sol注意到若确定了对着的两个面,就可以确定正方体上所有面的颜色。因此考虑枚举两个面,计算出\(8\)个角......
  • 使用 Python 和 Selenium 解决 Cloudflare 验证码
     在网络自动化测试或网页数据抓取的过程中,Cloudflare验证码是许多开发者遇到的棘手问题。这一验证码设计的初衷是为了保护网站免受恶意攻击,但它也给合法的自动化操作带来了不小的挑战。那么,使用Python和Selenium,是否有办法有效应对并解决Cloudflare验证码的问题?有哪些技巧和方......
  • GUI编程02:Panel面板讲解
    本节内容视频链接:4、Panel面板讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p=4&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5在窗口(frame)中添加面板(panel), 并解决了窗口关闭事件。packagecom.yundait.www;importjava.awt.*;importjava.awt.e......
  • ComfyUI-插件IPAdapter图片融合(附插件)
    哈喽大家好,前两期介绍了IPAdapter的风格迁移和人物形象迁移,这期来分享下如何利用IPAdapter实现两张图的融合参考图1参考图2融合图图片融合1、工作流将基础工作流中的【IPAdapterUnifiedLoader】节点换成【IPAdapterUnifiedLoaderCommunity】【IPAdapter】节......