[英]Interacting with iFrames Using Splinter/Selenium [Python]
注意:Selenium或API包装Splinter for Selenium的解决方案很好!
我在使用Splinter API for Python在Twitter.com上与iframe交互时遇到了问题。
例如,
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为目标。 所以我不确定如何在弹出窗口中找到/交互元素。
我尝试手动键入消息,然后以编程方式单击tweet按钮:
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/fxdriver@googlecode.com/components/command-processor.js:10092)
at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/fxdriver@googlecode.com/components/command-processor.js:12644)
at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
at DelayedCommand.prototype.executeInternal_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
at DelayedCommand.prototype.execute/< (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)
我非常希望使用Splinter实现我的目标,所以请不要提供替代方案,我知道还有其他方法。 先感谢您!
您的主要问题似乎是您将browser.find_by_xxx
的结果视为元素对象,而实际上它是一个元素容器对象(即webdriver元素列表)。
如果我明确引用该元素,写入该字段对我有用:
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]:
那将为我写出“Splinter示例”。
按钮单击失败,因为您的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]:
请注意,这里没有抛出任何异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.