【问题标题】:Unable to click on shadow root element using selenium无法使用硒单击阴影根元素
【发布时间】:2021-10-15 13:12:24
【问题描述】:

我正在尝试单击一个看起来像存在于影子根目录中的按钮。下面是我要点击的图片:

当我尝试单击其上方的元素时,收到元素不可交互的错误。

在 amazon prime music 上搜索任何歌曲,以便自己完成。

方法 1

song_result = driver.find_element(By.XPATH,"/html/body/div/music-app/div[4]/div/div/div/music-container/music-container[2]/div/music-shoveler")
song = song_result.find_element(By.TAG_NAME,"music-horizontal-item")
a = song.find_elements(By.TAG_NAME,"music-button")
a[1].click()

方法 2

driver.find_element(By.XPATH,"/html/body/div/music-app/div[4]/div/div/div/music-container/music-container[2]/div/music-shoveler/music-horizontal-item[1]/music-button[2]//button").click()
        

其实顺序是这样的:

<music-horizontal-item>
    <music-button>
        #shadowRoot
        <button>
    <music-button>
        #shadowRoot
        <button>This button I need to click

所以我按照你的建议使用了这个

song_result = driver.find_element(By.XPATH,"/html/body/div/music-app/div[4]/div/div/div/music-container/music-container[2]/div/music-shoveler")
song = song_result.find_element(By.TAG_NAME,"music-horizontal-item")
a = song.find_elements(By.TAG_NAME,"music-button")
song_root = driver.execute_script("return arguments[0].shadowRoot",a[1])
song_root.find_element(By.TAG_NAME,"button").click()a

仍然出现此错误:

Message: element not interactable

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    首先你必须用js选择shadow dom作为元素,然后用seleniumfind函数在里面搜索:

    方法1

    song = song_result.find_element(By.TAG_NAME,"music-button")
    song_root = expand_element(song)
    a = song_root.find_elements(By.TAG_NAME,"button")
    a[1].click()
    

    然后编写expand_element函数在element上执行js脚本,得到shadowRoot(more)

    def expand_element(element):
        return driver.execute_script("return arguments[0].shadowRoot",element)
    

    方法2(直接):

    song_root = driver.execute_script("return document.querySelector('music-button').shadowRoot")
    a = song_root.find_elements(By.TAG_NAME,"button")
    a[1].click()
    

    我看不到父元素,但说的是shadow dom中的“查找结构”

    music_h_i = driver.find_element_by_xpath("//music-horizontal-item")
    music_h_i_expanded = expand_element(music_h_i)
    music_button = music_h_i_expanded.find_elements(By.TAG_NAME,"music-button")
    music_button_expanded = expand_element(music_button)
    music_button.click() # or music_button_expanded.click()
    

    不需要使用来自/html/body/的xpath,xpath有很好的搜索功能

    【讨论】:

    • 我根据您的建议编辑了问题。我认为您误解了我需要单击哪个标签,因此我根据您的建议编辑了问题和一些代码,但仍然出现错误。消息:元素不可交互
    • @EXODIA 哪个元素不可交互?
    • @EXODIA 查看答案,已更新
    猜你喜欢
    • 2021-07-13
    • 2022-01-18
    • 2018-11-21
    • 1970-01-01
    • 2016-08-23
    • 2020-05-20
    • 1970-01-01
    • 2021-03-08
    • 2021-05-28
    相关资源
    最近更新 更多