осколок: видимое раскрывающееся меню кликабельно, но не может быть выбрано

Я пытаюсь выбрать что-то из выпадающего списка в модальном окне с помощью осколка. У меня нет проблем с поиском этого раскрывающегося списка, например. :

(Pdb) dropdown = next(i for i in my_browser.find_by_xpath('//select[@name="existing.widgets.user:list"]') if i.visible)

(страница, с которой я имею дело, на самом деле имеет несколько одинаковых модальных окон, поэтому мне нужно получить текущий видимый. Вздох..)

Выпадающий список можно нажать:

(Pdb) dropdown.visible
True
(Pdb) dropdown.click()  //succeeds and displays menu
(Pdb)

... но попытка выбрать его не удалась, хотя он якобы виден!

(Pdb) dropdown.select('my_val')
*** ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
    at fxdriver.preconditions.visible (file:///tmp/tmp6tSmOc/extensions/[email protected]/components/command-processor.js:9587)
    at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmp6tSmOc/extensions/[email protected]/components/command-processor.js:12257)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmp6tSmOc/extensions/[email protected]/components/command-processor.js:12274)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmp6tSmOc/extensions/[email protected]/components/command-processor.js:12279)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmp6tSmOc/extensions/[email protected]/components/command-processor.js:12221)
(Pdb) dropdown.visible
True  // what???
(Pdb)

Я почти уверен, что аргумент для выбора верен, поэтому я не понимаю, что здесь происходит.

Если ничего не помогает, могу ли я сделать что-то умное с xpaths? Или мне нужно попытаться найти/взаимодействовать с элементом другим способом?

Частичный скриншот ситуации с HTML: http://pasteboard.co/1I30ljRl.png


person norman    schedule 10.03.2015    source источник
comment
Вы щелкнули раскрывающийся список, прежде чем сделать выбор?   -  person alecxe    schedule 11.03.2015
comment
Также покажите HTML-представление элемента select или поделитесь ссылкой на веб-сайт, где мы можем это увидеть. Спасибо.   -  person alecxe    schedule 11.03.2015
comment
Я попытался нажать сначала; та же ошибка :-(   -  person norman    schedule 11.03.2015
comment
также добавил скриншот. Сайт не развернут/не доступен за пределами моей компании, поэтому я не могу предоставить ссылку.   -  person norman    schedule 11.03.2015
comment
Спасибо, а как насчет использования dropdown.select(value='my_val') вместо этого?   -  person alecxe    schedule 11.03.2015
comment
Неа; та же проблема. Интересно, что мой код отлично работает для первых двух одинаковых модальных окон на странице, но терпит неудачу при попытке заполнить третье. Глядя на то, является ли это порядком модальных или фактических модальных..   -  person norman    schedule 11.03.2015
comment
... порядок не имеет значения; те же не работают   -  person norman    schedule 11.03.2015


Ответы (1)


Как оказалось, меня поразили множественные модальные окна.

Учитывая мой раскрывающийся список с именем 'existing.widgets.user:list' и желаемым my_val, ошибочный вызов select в своем источнике имеет:

find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (dropdown['name'], my_val).click()

Теперь оказывается, что этот find_by_xpath на самом деле возвращает несколько/дубликаты параметров, возможно, из нескольких модальных окон!

(Pdb) blah=my_browser.find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (dropdown['name'], my_val)
(Pdb) blah
[<splinter.driver.webdriver.WebDriverElement object at 0x7f7205ff3750>, <splinter.driver.webdriver.WebDriverElement object at 0x7f7205ff39d0>, <splinter.driver.webdriver.WebDriverElement object at 0x7f7205ff38d0>, <splinter.driver.webdriver.WebDriverElement object at 0x7f7205ff3610>]
(Pdb) [bl.value for bl in blah]
[u'my_val', u'my_val', u'my_val', u'my_val']
(Pdb) [bl.visible for bl in blah]
[False, True, False, False]

Я думал, что смогу исправить это, получив доступ к параметрам через правильный модальный режим (например, с определенным классом формы), а не через всю страницу; то есть, начиная с чего-то вроде

form = my_browser.find_by_xpath('//form[@id="{0}"]'.format(my_current_modal))

...и ТОГДА пытаться

dropdown = form.find_by_xpath(...)
dropdown.select(...)
etc.

Но это привело к той же проблеме; все еще найдено несколько элементов, и все еще не удается! Итак, я прибегнул к проверкам видимости, которые действительно сработали:

opts = form.find_by_xpath('//select[@name="%s"]/option[@value="%s"]' % (dropdown['name'], my_val)
next(opt for opt in opts if opt.visible).click()

Возможно, я еще что-то упускаю... или даже что-то не так со Splinter, но, по крайней мере, это работает!

person norman    schedule 11.03.2015