2015-01-21 120 views
1

我對casperJS.I有相對較新的腳本,我想在頁面B中執行操作(即驗證用戶的確認郵件),然後在頁面A中繼續執行。代碼段如下所示CasperJS WaitFor不等待條件完成

casper.waitFor(function(){ 
    return this.run(function(){ 
    return verifyEmail(user_details['email']); 
    }); 
},function then(){ 
    this.wait(60000, function() { 
    this.reload(function(){ 
    this.echo("Refresh"); 
    this.capture('after-reload-a.png'); 
    }); 
    }); 
}); 

和verifyEmail被定義爲函數如下:

function verifyEmail(email){ 
    return casper.open('someURL').then(function(response){ 
     //extract URL from response 
        this.echo("URL"+url); 
     casper.start().thenOpen(url, function() { 
      this.waitForText('someText',function(){ 
       this.capture("final.jpg"); 
      }); 
     }); 
     return url; 
    }); 
}; 

執行期間,卡斯帕從未執行函數verifyEmail(從不打印URL),並用然後前進()功能。我在這裏錯過了什麼?

回答

1

在腳本中,您應該使用startrun函數,每個casper實例只能使用一次。由於CasperJS的執行是異步的,你不能返回任何東西。你必須等待它。

您可以使用第二個casper實例來設置全局變量,並在前一個實例中使用waitFor以等待其更改,如here

根據您從響應中提取URL的方式,在頁面上下文中使用__utils__.sendAJAX(someURL)可能更容易(通過casper.evaluate)。請注意,這不應該在casper.waitFor中完成,因爲它具有默認同步模式,在此模式下不需要等待。除了第一個函數回調函數waitFor被經常調用來檢查一個值是否改變,所以不應該這樣使用。

第三種可能性是僅使用一個實例進行導航。您似乎在解析其他頁面後重新加載了原始頁面。你爲什麼不通常訪問'someURL'thenOpen,做你的解析,然後打開原來的網址thenOpen沒有任何等待?您甚至可以將get the current URL保存爲(半)全局變量,以確保您回到正確的頁面。

+0

這是如何使用casperJS測試實例來實現的?是否有可能產生兩個實例? – Devi 2015-01-21 07:32:12

+0

這是不可能的。但是,也許你可以完全忘記第二個實例或Ajax。看來你重新加載了原始頁面。你爲什麼不通常用'thenOpen'來訪問''someURL'',做你的解析,然後用'thenOpen'打開原來的URL而不用等待?你甚至可以得到當前的URL,以確保你回到正確的頁面。 – 2015-01-21 07:36:56