【问题标题】:Interacting with iFrames Using Splinter/Selenium [Python]使用 Splinter/Selenium 与 iFrame 交互 [Python]
【发布时间】:2016-07-14 12:23:26
【问题描述】:

注意:Selenium 或 API 包装器 Splinter for Selenium 中的解决方案都可以!

我在 Twitter.com 上使用 Python 的 Splinter API 与 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) 点击“tweet”(提交) ..当然以编程方式。

我尝试检查该元素,但它似乎没有嵌套在 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 实现我的目标,所以请不要提供替代方案,我知道还有其他方法。 提前谢谢!

【问题讨论】:

    标签: javascript python selenium iframe splinter


    【解决方案1】:

    您的主要问题似乎是您将 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 Example”。

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

    注意这里没有抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2022-07-01
      相关资源
      最近更新 更多