【问题标题】:Having a hard time clicking on a radio button that activates a drop down. Using Selenium and Python很难单击激活下拉菜单的单选按钮。使用 Selenium 和 Python
【发布时间】:2019-11-15 23:32:25
【问题描述】:

所以通常我对单选按钮没有困难,但我试图从 chrome 设置中将 Web 浏览器设置为自定义 URL。我知道我必须激活允许我的下拉框(提供图片)。我找到了我认为是源的地方,并且不得不在一些影子 DOM 中导航。但是,在到达路径后,我尝试单击它,但出现错误

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (311, 1418)

我很困惑,我一直在努力解决这个问题。有人知道吗?当我亲自单击不同的选项时,我确实注意到一些设置发生了变化。这是图片

这是我的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
def expand_shadow_element(element):
    shadow_root = cdriver.execute_script('return arguments[0].shadowRoot', element)
    return shadow_root
#chrom driver
cdriver = webdriver.Chrome(executable_path='C:\\Users\\name\Downloads\\chromedriver.exe')
#open up page to chrome settings.
cdriver.get('chrome://settings/')

root1 = cdriver.find_element_by_tag_name('settings-ui')
shadow_root1 = expand_shadow_element(root1)

root2 = shadow_root1.find_element_by_id('main')
shadow_root2 = expand_shadow_element(root2)

root3 = shadow_root2.find_element_by_tag_name('settings-basic-page')
shadow_root3 = expand_shadow_element(root3)

root4 = shadow_root3.find_element_by_tag_name('settings-on-startup-page')
shadow_root4 = expand_shadow_element(root4)

root5 = shadow_root4.find_element_by_name('4')
shadow_root5 = expand_shadow_element(root5)

root6 = shadow_root5.find_element_by_id('button')
root6.click()

有人知道为什么我不能点击源吗?我什至右键单击单选按钮,这就是我指向的来源。

【问题讨论】:

    标签: python selenium selenium-webdriver selenium-chromedriver shadow-dom


    【解决方案1】:

    要解决元素点击拦截错误,您可以尝试 Javascript 点击,看看是否适合您。

    DOM 树有点难以理解,但我想我在这里发现了偏差——无线电设置位于 controlled-radio-button 元素下,而小圆圈本身是 <div class='disc'>,如您的代码示例中突出显示的那样。

    我没有看到您存储在root6 中的<div id="button"> 下的影子根——我看到了元素,但没有看到影子根,所以我假设单选按钮本身实际上位于root5 下。

    话虽如此,这里有一些代码可以使用 Javascript 单击单选按钮(根据其描述):

    # grab the radio element... tricky with shadow roots
    radio_button = root5.find_element_by_xpath("//div[@id='button']/div[@class='disc']")
    
    # attempt to click it using JS -- ignores ClickIntercepted error
    driver.execute_script("arguments[0].click();", radio_button)
    

    因为您已经找到了正确的单选组并将阴影元素存储在root5 变量中,您可以尝试在root5 上使用find_element_by_xpath 来抓取出现在它正下方的<div class="disc"> 元素。 Javascript 点击应该可以解决 ClickIntercepted 错误。

    【讨论】:

    • 非常感谢!它奏效了,我花了一段时间来阅读和理解解决方案是什么。在这方面我还是很陌生。
    • 使用影子根非常棘手,需要大量练习才能习惯。这个问题的答案帮助我打破了这个概念,更好地理解了一切:stackoverflow.com/questions/36656667/…
    • 再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2012-10-05
    • 2023-04-09
    • 2021-07-05
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多