python硒不能与输入元素交互?

时间:2019-11-29 20:30:21

标签: python python-3.x selenium

我正在尝试在输入字段中输入我的名字。建立硒似乎很简单,但是我无法弄清楚自己在做什么错。

name = driver.find_element_by_xpath('//input[@id="signUpName16"]')
name.send_keys('Josh')

我知道驱动程序可以工作,因为我已经能够单击其他元素。我知道xpath是正确的,因为我从chrome inspector复制了它。我得到的错误是

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

我看到人们说要尝试单击或清除元素,所以我也尝试过,但是仍然失败。

name = driver.find_element_by_xpath('//input[@id="signUpName16"]')
name.click()
name.send_keys('Josh')

将其作为名称。click()行

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

2 个答案:

答案 0 :(得分:0)

这里有些错误可能会出错。如果input尚未完全加载,那么如果您尝试在send_keys就绪之前进行尝试,它将抛出此异常。我们可以在WebDriverWait元素上调用input,以确保在将键发送给它之前已完全加载:

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


input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id, 'signUpName')]")))

input.send_keys("Josh")

如果仍然抛出异常,我们可以尝试通过Javascript设置input值:

input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id, 'signUpName')]")))

driver.execute_script("arguments[0].value = 'Josh';", input)

如果这些解决方案都不起作用,我们可能需要在正在使用的页面上查看一些HTML,以查看此处是否还有其他问题。

答案 1 :(得分:0)

ElementNotInteractableException 发生时间

  • 未显示元素,
  • 元素不在屏幕上,
  • 某些时间元素被隐藏或
  • 在另一个元素后面

请参考以下代码来解决此问题:

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


    driver = webdriver.Chrome(executable_path=r"C:\New folder\chromedriver.exe")


    driver.set_page_load_timeout("10")
    driver.get("your url")

    actionChains = ActionChains(driver)
    element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.XPATH, "//input[@id='signUpName16']")))
    actionChains.move_to_element(element).click().perform()

解决方案2:

element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.XPATH, "//input[starts-with(@id,signUpName')]"))) # if your signUpName16 element is dynamic then use contains method to locate your element
actionChains.move_to_element(element).click().perform()