使用Splinter/Senium[Python]与iFrame交互



注意:Selenium或API包装Splinter for Selenium中的解决方案很好!

我一直在使用Python的Splinter API与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。所以我不知道如何在这个弹出窗口中找到元素/与之交互。

我试着手动输入一条消息,然后以编程方式点击推特按钮:

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]:

这将为我在字段中写入"拆分示例"。

按钮单击失败,因为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]:

请注意,这里没有抛出异常。

相关内容

  • 没有找到相关文章

最新更新