• selenium中定位shadow-root,以及获取shadow-root内部的数据


    通过shadow-root的父级定位到shadow-root,再通过语句进行操作
    两种方法:
    第一种,Python种JS实现
    第二种,selenium实现

    1.0 案例网站

    参考某橘色网站
    在这里插入图片描述

    2.0 js语句定位

    可在控制台进行测试
    在这里插入图片描述
    测试语句

    document.querySelector("ali-bar-new").shadowRoot.querySelector("ali-bar-menu").shadowRoot.querySelector("div")
    
    • 1

    3.0 python实现js的方法

    3.1 selenium实现

    execute_实现

    driver.execute_script('document.querySelector("ali-bar-new").shadowRoot.querySelector("ali-bar-menu").shadowRoot.querySelector("div")')
    
    • 1

    python直接实现

    # example
    root = driver.find_element("id", "form-shadow-root")
    shadow_root = root.shadow_root
    textfield = shadow_root.find_element_by_css_selector("div#dialog > div:nth-child(2) input")  # id为dialog的div的下一级div的第二个,之后的相对的input tag(无所谓层级)
    btn = shadow_root.find_element_by_css_selector("button[class='btn next-button']") # tag为button的class为该值的元素
    dropdown_item = shadow_root.find_element_by_css_selector('#search-field').find_element_by_xpath("//div//ul/li[text()='default']")  # 先找css然后再找sub element
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2 python中直接调用执行js

    3.2.1 基本操作

    import js2py# 执行单行js语句
    result = js2py.eval_js("console.log(abcd)")
    print(result)
    # 执行写在js文件中的
    log = js2py.eval_js(open('./log.js','r',encoding='utf-8').read())
    print(log)
    
    js = js2py.EvalJs({})
    js.execute("js语句")
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    import js2py
    #创建js执行环境,返回一个上下文对象
    content = js2py.EvalJs()
    #执行js代码
    #获取时间戳的js代码
    js_text = '''
          var r = new Date().getTime()   
    '''
    content.execute(js_text)
    print(content.r)
    #执行js函数法二:
    #会将文件中的代码添加到content对象中
    content.execute(open('./log.js','r',encoding='utf-8').read())
    print(content.需要执行的函数名('数据'))  #调用js代码中名为的函数
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.2.2 execjs实现

    import execjs
    js_code = open('file.js',encoding='utf-8').read()
    ctx = execjs.compile(js_code)# 第一个参数为ja代码中的函数名, 后面为函数对应的参数
    result = ctx.call('function_name', *args)
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    交换机笔记二
    14.HTML和CSS 02
    Unity3D Entity_CacheService实现详解
    Aptitude - Debian GNULinux 软件包管理工具
    开发那些事儿:如何利用Go单例模式保障流媒体高并发的安全性?
    Allegro批量剪断走线操作
    文本攻击方法开源代码汇总
    C++STL——vector的模拟实现(代码+解析)
    欧拉公式 Euler‘s Formula
    【概率论基础进阶】随机事件和概率-随机事件、事件间的关系与运算
  • 原文地址:https://blog.csdn.net/xiameimei_win/article/details/132621128