Selenium不会输入到textarea并引发ElementNotInteractableException

问题描述 投票:-1回答:2

这是所讨论的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()

代码将执行,没有任何反应。我假设它选择了textarea,但没有在其中输入任何内容?还是什么也没有发生。它还会找到该元素,因此我认为不需要等待textarea可见。当我不使用js而只做

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

它给了我ElementNotInteractableException。

python selenium xpath css-selectors webdriverwait
2个回答
0
投票

ElementNotInteractableException当元素存在于DOM中但不处于可以交互的状态时发生。例如;隐藏或不在屏幕上时等。

一种选择是尝试使用javascript插入值;您已经尝试过了。但是,由于您使用了选择器以及将其传递到js的方式,因此无法正常工作。

应该在要执行的javascript代码中选择并更新DOM元素。

尝试一下:

driver.execute_script(f'var element = document.getElementsByName("text")[0]; element.value = "Whats up mate, how you doin";')

此正在运行的DOM操作的示例:https://jsfiddle.net/qvt68jad/


0
投票

此错误消息...

ElementNotInteractableException

...表示WebDriver实例无法与所需元素作为Element was Not Interactable进行交互。


分析

您实际使用的Locator Strategy标识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,并且可以使用以下Locator Strategies中的任何一个:

  • 使用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
    
© www.soinside.com 2019 - 2024. All rights reserved.