1

我正在使用 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 也不是自动完成字段的常规文本字段怎么会这样?

4

2 回答 2

0

如果您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_idif not 尝试使用css selectorif you can 而不是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)
于 2013-10-02T11:25:50.290 回答
0

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

#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,但仍处理查找输入,然后迭代该列表并检查其是否在顶部

于 2013-10-02T12:06:50.613 回答