【问题标题】:Selenium: Element Click Intercepted while submitting a formSelenium:提交表单时拦截元素点击
【发布时间】:2021-09-04 15:41:33
【问题描述】:

所以我正在尝试提交一个表单,但有些东西阻止我访问该框,或者我使用了错误的元素,但我认为我使用了正确的元素。

这是我的代码:

from selenium import webdriver

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome(executable_path = 'mypath/chromedriver.exe') 
driver.maximize_window()
#driver.implicitly_wait(50)
driver.get("https://ai.fmcsa.dot.gov/SMS")
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@title='Close']"))).click()
wait = WebDriverWait(driver, 20)
driver.find_element_by_xpath('//*[@id="home-body"]/div[1]/div/div[1]/form/label').click()
driver.find_element_by_xpath('//*[@id="home-body"]/div[1]/div/div[1]/form/label').send_keys('1818437')
driver.find_element_by_xpath('/html/body/div[3]/div[2]/article/section[2]/div[1]/div/div[1]/form/input[2]').click();

我得到的输出是

ElementClickInterceptedException:消息:元素点击被拦截: 元素...是 在点 (553, 728) 不可点击。其他元素将收到 点击:
(会话信息:chrome=93.0.4577.63)

可能是什么问题?

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    在这种情况下需要注意的事项:-

    1. 当您定义显式等待wait = WebDriverWait(driver, 20) 时,您始终可以在范围内使用wait reference。你不需要在同一个类中一次又一次地创建

    2. 尽量避免绝对xpath /html/body/div[3]/div[2]/article/section[2]/div[1]/div/div[1]/form/input[2],尝试使用相对xpath/xpath轴。

    3. 当我们尝试向某个元素发送键时,通常它应该是一个输入标签,而不是label

    4. 您可能需要滚动,在这种情况下可能不是,但是当您手动滚动以与 UI 中的元素交互时,Selenium 也必须自动化。

    5. 我还观察到这个 webapp 搜索和输入标签是重复的,所以我使用 xpath 索引[2] 来处理。

    示例代码:-

    driver = webdriver.Chrome(executable_path = 'mypath/chromedriver.exe') 
    driver.maximize_window()
    #driver.implicitly_wait(50)
    driver.get("https://ai.fmcsa.dot.gov/SMS")
    wait = WebDriverWait(driver, 20)
    wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@title='Close']"))).click()
    wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@name='MCSearch'])[2]"))).send_keys('1818437')
    wait.until(EC.element_to_be_clickable((By.XPATH, "(//input[@name='search'])[2]"))).click()
    

    【讨论】:

    • 我非常感谢这些提示!有没有办法在不让代码实际打开 Chrome 实例的情况下进行这种抓取?比如,在后台运行它
    • @alexb :是的,有一个无头模式。试试看吧。
    【解决方案2】:

    xpaths下方也可以使用。

    driver.find_element_by_xpath("//div[@class='sms-search-box']//input[1]").send_keys('1818437')
    driver.find_element_by_xpath("//div[@class='sms-search-box']//input[2]").click()
    

    【讨论】:

      【解决方案3】:

      您使用的 Xpath 不正确。您输入字段的 xpath 应该是这样的。

      driver.find_element_by_xpath("//input[@name='MCSearch' and @placeholder='Type Name or U.S. DOT#']").send_keys("1818437")
      driver.find_element_by_xpath("//input[@placeholder='Type Name or U.S. DOT#']//following::input[@value='Search']").click();
      

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 2020-02-23
        • 1970-01-01
        • 2020-01-04
        • 2021-10-08
        • 2021-10-14
        • 2020-08-07
        • 2021-02-26
        • 1970-01-01
        相关资源
        最近更新 更多