Selenium 不会输入文本区域并引发 ElementNotInteractableException

Selenium won't type to textarea and raises ElementNotInteractableException

这是有问题的 HTML 代码:

<textarea rows="1" cols="1" name="text" class=""></textarea>

这是我的代码:

msgElem = driver.find_element_by_css_selector("textarea[name='text']")
driver.execute_script("arguments[0].click();", msgElem)
driver.execute_script("arguments[0].value = 'Whats up mate, how you doin';", msgElem)
msgElem.submit()

代码执行但没有任何反应。我假设它选择了文本区域但没有输入任何内容?或者什么都没有发生。它还找到了元素,所以我假设我不需要等待文本区域可见。 当我不使用 js 而只是做

msgElem = driver.find_element_by_css_selector("textarea[name='text']")
msgElem.send_keys('Whats up mate, how you doin')

它给了我 ElementNotInteractableException。

这个错误信息...

ElementNotInteractableException

...暗示 WebDriver 实例无法与所需元素交互,因为 Element was Not Interactable.


分析

第一个匹配元素的 which you have used actually identifies two elements within the HTML DOM和父元素包含属性style="display:none"如下:

<form action="#" class="usertext cloneable warn-on-unload" onsubmit="return post_form(this, 'comment')" style="display:none" id="form-dyo">
    <input type="hidden" name="thing_id" value="">
    <div class="usertext-edit md-container" style="">
        <div class="md">
            <textarea rows="1" cols="1" name="text" class=""></textarea>
        </div>

因此你看到 ElementNotInteractableException


解决方案

要将 字符序列 发送到您需要为 element_to_be_clickable() 引入 WebDriverWait 的所需元素,您可以使用以下任一项 :

  • 使用CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.title + div textarea[name='text']"))).send_keys("Sowik")
    
  • 使用XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='message']//following::div[1]//textarea[@name='text']"))).send_keys("Sowik")
    
  • 注意:您必须添加以下导入:

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