【问题标题】:Unable to type into text field of Javascript form with Selenium / Python (element not interactable)无法使用 Selenium / Python 输入 Javascript 表单的文本字段(元素不可交互)
【发布时间】:2013-10-02 11:03:07
【问题描述】:

我正在使用 Selenium 并使用 Python 进行编码。

我正在尝试执行以下操作:对于航班搜索网站,在航班 1 的“输入路线代码”文本框下,输入“AA”

这是我目前拥有的代码:

flight1_routing = driver.find_element_by_xpath(".//*[@id='ita_form_location_RouteLanguageTextBox_0']")
flight1_routing.clear()
flight1_origin.send_keys("AA")

但是,相反,我收到此错误消息:“无效元素状态:元素当前不可交互并且可能无法操作”。 AFAIK 也不是自动完成字段的常规文本字段怎么会这样?

【问题讨论】:

  • 您需要与您提供的元素进行交互吗?您能否使用“id”“widget_advancedfrom1”进行管理,在该“id”上输入“AA”似乎可以激活您希望与之交互的元素?

标签: python python-2.7 selenium


【解决方案1】:

如果您收到Element is not currently interactable,请检查该元素是否未被禁用且可见。如果你想hack 它执行JS 来启用它。

我访问了主页id ita_form_location_RouteLanguageTextBox_0 不存在,在航班一号下也没有Enter routing code。我可以看到文本框说airport city or city name

此外,如果您有 id,则更喜欢使用find_element_by_id,如果可以,请尝试使用css selector,而不是xpath。干净多了。

更新

这是一个工作脚本:

如上所述,选择的elements 不是visible。实际完成的是,有 5-6 个不同的 elements 全部隐藏,当您单击显示高级路线时,它会随机选择 2 个并使其可见。

所以id 并不总是相同的。如果您使用相同的 id,您有时会得到一个隐藏的 element(因为它会选择随机 id),所以 selenium 无法处理它。我做了一个选择器,它得到了 2 个隐藏的 elements

from selenium import webdriver
import selenium.webdriver.support.ui as ui

driver = webdriver.Firefox()
driver.get("http://matrix.itasoftware.com/")
#click on the multi tab
tab = driver.find_element_by_id("ita_layout_TabContainer_0_tablist_ita_form_multislice_MultiSliceForm_0").click()
#click on the advanced routes
advanced_routing=ui.WebDriverWait(driver, 10).until(
     lambda driver : driver.find_element_by_id("sites_matrix_layout_RouteLanguageToggleLink_1")
)
advanced_routing.click()
#get all visible elements with id like ita_form_location_RouteLanguageTextBox. its similar to regex ita_form_location_RouteLanguageTextBox.*
element = ui.WebDriverWait(driver, 10).until(
        lambda driver : driver.find_elements_by_css_selector("[id*=ita_form_multislice_MultiSliceRow] [id*=ita_form_location_RouteLanguageTextBox]")
)
element[0].send_keys("foo")
element[1].send_keys("bar")

import time
time.sleep(20)

【讨论】:

  • 啊,我认为这是因为您必须先单击“高级路由代码”链接,这将启用该字段。我忘记了这个选项是通过 cookie 或其他方式为我默认存储的。
  • @Infection 嗨,伙计,我搞定了,我会更新我的答案来解释它是如何工作的
  • 非常感谢 Foo Bar!
【解决方案2】:

您是否首先点击了正确的标签并启用了高级路由代码?例如

#Go to right tab
driver.find_element_by_css_selector("div#ta_layout_TabContainer_0_tablist_ita_form_multislice_MultiSliceForm_0 > span").click()
#Enable routing
driver.find_element_by_css_selector("a.itaToggleLink").click()

#note I seem to get a different id to the one you're using, assuming its dynamic numbering so handling all cases
#if you know how the dynamic numbering works youmay be able to deduce a single id that will work for your test case
#Instead I'm going for finding all elements matching a pattern then searching through them, assuming only one will be visible
flight1_routings = driver.find_elements_by_css_selector("input[id^='ita_form_location_RouteLanguageTextBox_']")
#probably better finding it then using it separately, but I was feeling lazy sorry.
for route in flight1_routings:
    if route.is_displayed():
        route.clear()
        route.send_keys("AA")

您也可以跳过 .clear() 调用,因为看起来该框开始时没有要覆盖的文本。

编辑:更新了启用路由切换以处理不知道 id 的情况,类名保持不变,应该可以工作。尽管 foo bar 使用 css 选择器建议的变量 id 处理查找输入,然后迭代该列表并检查其是否在顶部

【讨论】:

  • 嗨戴夫!我确实确实先点击了右侧的标签(对不起,我在第一篇文章中没有说清楚)。不过这真的很奇怪,因为我的 ID 和你的不一样——我也不太清楚出了什么问题。例如,在“启用路由”下,我在多城市选项卡下该特定链接的 ID 是 sites_matrix_layout_RouteLanguageToggleLink_0
  • 我假设 id 是在页面加载时动态创建的 - 由于 cookie 值导致您在第一次登陆时获得了不同的选项卡,因此您会生成不同的 id。所以看到的第一个选项卡的启用路由链接的 ID 为“0”,无论是哪个选项卡。希望对您有所帮助... 或者,您可以使用上面 foo bar 所示的 CSS 选择器来获取元素列表,而不管末尾的数字如何,然后选择通过 .is_displayed() 布尔检查的元素。 (如果点击将 cookie 设置为右侧选项卡的页面,该列表将仅包含一个元素)
猜你喜欢
  • 2020-03-08
  • 2021-12-16
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2020-03-25
  • 1970-01-01
相关资源
最近更新 更多