【问题标题】:Can't locate this input element selenium找不到这个输入元素 selenium
【发布时间】:2021-09-13 07:28:24
【问题描述】:

我正在尝试在此网页上找到输入 “to” 字段:Link here (很抱歉必须登录才能看到它)

我的代码:

name_field = driver.find_element_by_xpath("//form[@id='compose-message']/div[6]/div/div/div[2]/div/div/textarea")

但这会产生以下错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//form[@id='compose-message']/div[6]/div/div/div[2]/div/div/textarea"}
  (Session info: chrome=93.0.4577.63)

由于某种原因,此页面是唯一给我带来任何问题的页面。

【问题讨论】:

    标签: python-3.x selenium


    【解决方案1】:

    大部分textarea 网络元素都包裹在iframes中。

    使用explicit waits,确实为您的脚本提供了所需的稳定性。

    也更喜欢使用css selector 而不是xpath

    Selenium中,要访问iframe内部的elements,我们需要将webdriver的焦点切换到iframe。如下所示

    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src^='/message/compose/']")))
    

    一旦你进入这个iframe,你就可以与to输入网络元素进行交互。如下所示

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.NAME, "to"))).send_keys('something here')
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='message']/following-sibling::div/descendant::textarea"))).send_keys('Some message')
    

    进口:

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

    另外,请记住在完成iframe. 后切换到default content

    driver.switch_to.default_content()
    

    为了使用iframe之外的元素

    【讨论】:

    • 感谢您的回答。您的代码用于定位 to 字段。我尝试进入消息字段,但似乎无法遵循与message_field = wait.until(EC.visibility_of_element_located((By.XPATH, "//textarea[@name='text']"))) 相同的模式。你会知道为什么吗?
    • 您使用的 xpath 有 2 个匹配节点,所以试试这个 WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='message']/following-sibling::div/descendant::textarea"))).send_keys('Some message') 我上面也更新了。
    • "大部分textarea 网络元素都包裹在iframes 中。" => 我不认为这是一个“通用”声明......,您可能想在这个网站上添加一个“......”......//“也更喜欢使用 css selector 而不是 xpath 。” => 是的,同样的意见......(就像我试图在几个不同论坛上的几个并行线程之一中向@OP 解释:forum.imacros.net/…
    【解决方案2】:

    您要查找的元素位于iframe 中。能够使用以下代码查找文本并将其发送到元素。

    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    import time
    
    opt = ChromeOptions()
    opt.add_argument("--user-data-dir=C:\\Users\\*****\\AppData\\Local\\Google\\Chrome\\User Data")
    driver = webdriver.Chrome(executable_path="path to chromedriver.exe",options=opt)
    
    driver.maximize_window()
    driver.implicitly_wait(10)
    
    driver.get("https://www.reddit.com/message/compose/")
    driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@class='saPujbGMyXRwqISHcmJH9']"))
    driver.find_element_by_xpath("//input[@name='to']").send_keys("Sample Text")
    driver.find_element_by_xpath("//div[@class='usertext']//textarea").send_keys("Sample Text")
    
    time.sleep(5)
    driver.quit()
    

    【讨论】:

      【解决方案3】:

      首先,该元素位于 iframe 中。要访问它,您需要切换到该 iframe。此外,您的定位器看起来不太好。 请尝试以下代码:

      wait = WebDriverWait(driver, 20)
      wait.until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[contains(@src,'message')]")))
      name_field = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@name='to']")))
      

      要使用上述预期条件,您需要以下导入:

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

      【讨论】:

        【解决方案4】:

        使用命令 CSS 选择器代替 XPath,例如使用下面的代码。

        yourwebsriver.find_elements_by_css_selector("textarea[name=text]").send_keys('something here')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          • 2021-10-19
          • 2019-01-02
          • 2021-03-14
          相关资源
          最近更新 更多