无法使用Selenium/Python在Javascript表单的文本字段中键入(元素不可交互)

无法使用Selenium/Python在Javascript表单的文本字段中键入(元素不可交互),python,python-2.7,selenium,Python,Python 2.7,Selenium,我正在使用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") 但相反,我得到了

我正在使用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")
但相反,我得到了以下错误消息:元素状态无效:元素当前不可交互,并且可能无法操作。如果一个常规文本字段也不是自动完成字段,那么这怎么可能呢?如果您得到的元素当前不可交互,请检查该元素是否未被禁用及其可见。如果您想破解它,请执行JS以启用它

我访问了主页id ita_form_location_RouteLanguageTextBox_0不存在也在一号航班下没有输入路由代码。我可以看到文本框显示机场城市或城市名称

另外,如果您有id,则更愿意使用find_element_by_id,如果没有,则尝试使用css选择器(如果可以),而不是xpath。它干净多了

更新

下面是一个工作脚本:

如上所述,所选元素不可见。实际的做法是,有5-6个不同的元素全部隐藏,当你点击ShowAdvancedRoute时,它会随机选取2个元素并使它们可见

所以id并不总是相同的。如果使用相同的id,有时会得到一个隐藏元素,因为它会随机选取id,因此selenium无法处理它。我制作了一个选择器来获取2个隐藏元素


您是否先单击正确的选项卡并启用高级路由代码??e、 g

#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的情况,类名保持不变,应该可以工作。按照css选择器的foo-bar建议,处理如何查找变量id的输入,然后迭代该列表并检查其是否在顶部

是否需要与您提供的元素交互?您可以使用“id”小部件\u advancedfrom1进行管理吗?输入AA将激活您希望与之交互的元素。嗨,Dave!我确实先点击了右边的标签,很抱歉我在第一篇文章中没有说清楚。这真的很奇怪,因为我的身份证和你的不一样——我也不太确定到底是怎么回事。例如,在“启用路由”下,“多城市”选项卡下的特定链接的ID为“站点”\u矩阵”\u布局”\u路由LanguageLoggleLink\u 0I假设该ID是在页面加载时动态创建的,并且由于cookie值的结果,您在第一次登录时有一个不同的选项卡,因此生成了不同的ID。因此,无论是哪个选项卡,看到的第一个选项卡都具有其启用路由链接的“0”id。希望对你有点帮助。。。或者,您也可以使用CSS选择器(如上所示),通过foo-bar获得元素列表,而不考虑末尾的数字,然后选择通过.is\u显示bool检查的元素。如果点击页面时cookie设置在右边的选项卡上,该列表将只包含一个元素,我认为这是因为您必须首先单击“高级路由代码”链接,这将启用该字段。我忘了这个选项是通过Cookie或其他东西默认存储的。@嗨,伙计,我让它工作了,我会更新我的答案来解释它是如何工作的谢谢Foo Bar!
#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")