【问题标题】:confirm alert window in phantom.js确认 phantom.js 中的警报窗口
【发布时间】:2013-11-11 09:42:55
【问题描述】:

我有这个查找按钮并单击它的功能,但是在出现该警报之后,我需要使用 phantom.js 确认它

function() {
  page.evaluate(function() {
    $('.item-list clicked').first().find($('.comment-delete')).find('a').click();
  })
}

也许我可以模拟无需立即点击即可调用警报的功能?还是使用函数 waitFor 来等待这个警报?(不太可能,waitFor 只等待 DOM 对象,我认为是这样)

【问题讨论】:

    标签: javascript web-scraping phantomjs confirm


    【解决方案1】:

    我也找不到其他帮助我回答这个问题的 stackoverflow 答案,但基本上你可以注入一个 javascript 函数来确认弹出警报:

    这是我的 python webdriver 实现:

    def example_js_confirmation( self ):
        js_confirm = 'window.confirm = function(){return true;}'    # .js function to confirm a popup
        self.execute_javascript( js_confirm )
        self.find_by_id( 'submit' ).click()
        self.execute_javascript( 'return window.confirm' )  # trigger the injected js that returns true (virtually click OK)
    

    它在某人的待办事项列表上 =) : Selenium Desired Capabilities - set handlesAlerts for PhantomJS driver

    【讨论】:

      【解决方案2】:

      据我所知,Phantom.JS 是无头的。 您唯一能做的就是获取警报的上下文

      window.onAlert = function(alertText){
          ...
         }
      

      但我认为仅此而已。 您不能以编程方式关闭(通常)或呈现(在 Phantom.JS 中)警报。

      一些来源:
      * Render JavaScript alerts with Phantom.JS
      * Close alert programmatically

      【讨论】:

      • 哦,很遗憾,但谢谢你的回答。您可能知道其他能够确认警报的工具吗?)
      • 你可以使用 Zombie.js(见here)。也看看 SlimerJS:它可能有 window.alert...
      【解决方案3】:

      “确认警报”是一个令人困惑的短语,因为 Javascript 提供了 alert(显示带有 OK 按钮的消息)和 confirm(显示 OK 和 Cancel 按钮),并且不清楚您是哪一个意思。

      至少 PhantomJS 2.x 的行为就像在 alert 框上单击“确定”和在 confirm 框上单击“取消”一样。

      如果您想在confirm 框上单击“确定”而不是“取消”,您可以调用execute_javascript 覆盖window.confirm 以返回true,只要您不担心弹出的confirm在加载过程中在您的execute_javascript 有机会干预之前处理。如果你也想捕获这些,我能想到的最好的办法是修补 PhantomJS 源或通过上游代理注入 JS。

      【讨论】:

        【解决方案4】:

        我做到了:

        // 1) override window.alert
        page.evaluate(function(){
          window.alert = function(msg){
            window.callPhantom({alert: msg}); // will call page.onCallback()
            return true; // will "close the alert"
          };
        });
        
        // 2) re-bind to onAlert()
        page.onCallback = function(obj) {
          page.onAlert(obj.alert); // will trigger page.onAlert()
        };
        

        【讨论】:

          猜你喜欢
          • 2015-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-21
          • 1970-01-01
          • 2012-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多