2017-04-26 56 views
0

嘗試通過casperjs點擊下面的元素點擊,但它不是爲我工作。通過casperjs

<img alt="Pay Button" class="v-button" role="button" src="https://test/wallet-services-web/xo/button.png" tabindex="0" style="cursor: pointer; transition-property: filter; transition-duration: 0.25s; filter: brightness(1);"> 

我通過了一堆在嵌套的iframe中尋找這個元素,我可以正確地找到它 - 但我似乎無法在它正確點擊。

if (casper.exists('img.v-button')) { 
     console.log("Found button"); // the exists works - this is logged 

     casper.click('img.v-button'); // Approach 1: nothing happens 

     // Approach 2: nothing happens 
//  var x = require('casper').selectXPath; 
//  casper.click(x('(//img[@class="v-button"])')); 

     return true; 
    } else { 
     var result = traverseTreeDown(); 
     if (result) { 
      return true; 
     } else { 
      casper.page.switchToParentFrame(); 
     } 
    }     

兩種方法1和2都無法點擊 - 即使我確實正確地在「存在」區域內進入。

+0

這也許是因爲卡斯珀是** **異步。我認爲你在處理點擊之前從函數返回'true'。嘗試在'setTimeout(()=> casper.click(img),0)'中換行。 – Todd

+0

有趣的一點 - 將嘗試併發回。所以,當你在一個「casper.then(function()」)塊的「內部」時,我們不能假定嚴格的順序來完成指令?如果我們需要嚴格排序兩個命令到完成,他們需要在連續的,但是單獨的「casper.then(函數()」塊?或者,通過創建一個超時單獨的線程如你所說...... – Phoeniyx

回答

0

你應該嘗試的辦法建議在casperjs documentation

casper.then(function() { 
    casper.click('img.v-button'); 
}); 

casper.then(function() { 
    // do next action 
}); 
+0

哦,我的代碼段中已經處於「casper.then(函數(){」塊。我只是沒有包括它的簡潔。我貼是內部「casper.then(函數(){」塊。 – Phoeniyx

0

我建議您查看API documentation

例如,檢查了這一點:你可以等待一個特定的選擇存在。

casper.start('https://yourmom.gov'); 

casper.waitForSelector('img.v-button', function() { 
    this.click('img.v-button'); 
}); 

casper.run(); 

或有另一種方式 - 我覺得更好

casper.start('http://yourmom.gov/').thenClick('img.v-button', function() { 
    this.echo("clicktastic."); 
}); 

casper.run(); 
+0

THX。但正如我所提到的元素已經在那兒了。我的第一線代碼是「if(casper.exists('img.v-button')){」..它存在,因爲我的console.log打印正確。但是一旦在塊中,點擊不起作用。如果元素didn'如果不存在,我不會在第一個地方進入,我的console.log也不會被打印出來,所以沒有什麼可以想象的。 – Phoeniyx