Взаимодействие с iFrames с помощью Splinter/Selenium [Python]

примечание: решение в оболочке Selenium или API Splinter for Selenium подойдет!

У меня возникли проблемы при взаимодействии с iframes на Twitter.com с использованием API Splinter для Python.

Например,

with Browser('firefox', profile_preferences= proxySettings) as browser:
    #...login and do other stuff here
    browser.find_by_id('global-new-tweet-button').click()

это вызывает всплывающее окно для ввода твита.

Как мне взаимодействовать с этим новым полем с помощью Splinter, чтобы: 1) заполнить сообщение 2) нажать «твитнуть» (отправить) ... программно, конечно.

Я попытался проверить элемент, но он, похоже, не вложен в iframe, однако он нацелен на iframe. Поэтому я не уверен, как найти/взаимодействовать с элементами в этом всплывающем окне.

Я попытался вручную ввести сообщение, а затем программно нажать кнопку твита:

browser.find_by_css('.btn.primary-btn.tweet-action.tweet-btn.js-tweet-btn').click()

..но я получаю сообщение об ошибке:

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
    at fxdriver.preconditions.visible (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:10092)
    at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12644)
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12661)
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12666)
    at DelayedCommand.prototype.execute/< (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12608)

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


person J. Dude    schedule 26.03.2016    source источник


Ответы (1)


Ваша основная проблема заключается в том, что вы обрабатываете результаты browser.find_by_xxx как объект элемента, когда на самом деле это объект контейнера элемента (т.е. список элементов веб-драйвера).

Запись в поле работает для меня, если я явно ссылаюсь на элемент:

In [51]: elems = browser.find_by_id('tweet-box-global')
In [52]: len(elems)
Out[52]: 1
In [53]: elems[0].fill("Splinter Example")
In [54]:

Это напишет для меня «Пример осколка» в поле.

Нажатие кнопки не работает, потому что ваш путь css возвращает список из трех элементов, и вы неявно нажимаете на первый скрытый элемент. В моем тестировании элемент, на который вы действительно хотите щелкнуть, является вторым элементом в списке:

In [26]: elems = browser.find_by_css('.btn.primary-btn.tweet-action.tweet-btn.js-tweet-btn')
In [27]: len(elems)
Out[27]: 3
In [28]: elems[1].click()
In [29]:

Когда я явно нажимаю на второй элемент, он не выдает ошибку, и кнопка нажимается.

Если вы добавите к пути css, вы можете сузить результаты только до кнопки в видимом модальном окне:

In [42]: css_path = "div.modal-tweet-form-container button.btn.primary-btn"
In [43]: elems = browser.find_by_css(css_path)
In [44]: len(elems)
Out[44]: 1
In [45]: elems.click()
In [46]:

Обратите внимание, что здесь не было создано никаких исключений.

person Levi Noecker    schedule 06.05.2016