2014-10-19 46 views
0

我試圖單擊評估頁面上的x個對象,但它在所有日子星期日嘗試後失敗..我有以下代碼,您可以看到我建立一個列表對象在我的變量(稱爲itemsToAdd),然後我需要將它傳遞到評估頁面上,然後將這些對象進行點擊。使用CasperJS單擊評估頁面上的對象

我知道你不能將複雜的對象傳遞到評估頁面,但我嘗試過的每一次嘗試都失敗了..我試過了所有的東西,請幫助。我也嘗試過自定義js文件,但我無法得到這個工作。

$(function(ns) { 
    ns.myMethod = function(itemArray) { 
     var items = itemArray.items; 

     for (i = 0; i < items.length; i++) { 
      casper.thenEvaluate(function() { 
       casper.click(items[i].buttonId); 

       casper.waitUntilVisible(items[i].basketId, function() { 
        casper.echo(items[i].successMessage); 
       }); 
      }); 
     } 

     return this; 
    }; 
})(namespace('test')); 

這是我的變量,buttonId是評估頁面上按鈕的DOM ID。 basketId是評估頁面上的另一部分,它被更新以表示點擊按鈕的工作。

復變

var itemsToAdd = { 
    'items': [ 
     { 
      buttonId: '#button1', 
      basketId: '#nowInBasket1', 
      successMessage: 'It worked' 
     }, 
     { 
      buttonId: '#button2', 
      basketId: '#nowInBasket2', 
      successMessage: 'this worked aswell' 
     } 
    ] 
}; 

調用代碼

test.myMethod(itemsToAdd); 
+0

您是使用自定義測試框架('$')還是將它發佈到某處?你能鏈接到它嗎? – 2014-10-19 17:30:28

+0

什麼都沒有,顯然我們有jquery。 – user3773890 2014-10-19 21:02:34

+0

jQuery在頁面上下文中有意義,但不在casper上下文中。 casper上下文中沒有DOM,所以大多數jQuery函數都會被破壞。 – 2014-10-19 21:12:06

回答

0

有你的代碼多個問題。

evaluate是沙盒頁面上下文。裏面沒有CasperJS或PhantomJS功能。但它看起來並不像使用頁面上下文,所以您應該將thenEvaluate更改爲then。我寫過帖子here,顯示哪些東西可以使用evaluate功能/頁面上下文。

JavaScript有函數範圍。閱讀question瞭解更多信息。這意味着循環完成後所有的i指向最後的i。你需要一個閉包來解決這個問題(這裏我使用了一個IIFE,但你也可以將循環改爲itemArray.items.forEach(...)。

var items = itemArray.items; 

for (i = 0; i < items.length; i++) { 
    (function(i){ 
     casper.then(function() { 
      casper.click(items[i].buttonId); 

      casper.waitUntilVisible(items[i].basketId, function() { 
       casper.echo(items[i].successMessage); 
      }); 
     }); 
    })(i); 
} 

如果這不能解決您的問題那麼這可能是你的$框架,不管這是一個問題。

+0

我不確定何時使用評估或評估..有什麼區別? – user3773890 2014-10-19 17:37:26

+0

你不能用'thenEvaluate'返回任何東西,所以它作爲一個void函數執行,但是是異步執行的(調度一個步驟)。 'evaluate'立即執行。 – 2014-10-19 17:39:38