ログイン方法の詳細が記載されたサイトのリストを含むjsonファイルを読み取り、各キーワードの検索ページを実行することになっているCasperJSのスクリプトを作成しました。
機能する 1 つのサイトでコードをテストしましたが、2 番目のサイトではログインしますが、検索ページに移動しようとすると空のページが返されます。
これは私のキャスパーのセットアップです:
casper = require('casper').create(
clientScripts: [
'jquery.min.js'
]
verbose: true
logLevel: "debug"
)
これはループコードです:
casper.start().each sites, (self, site)->
search_results[site.title] = {}
self.thenOpen site.login.path,
method: "get"
data: site.login.getdata
, ->
@echo "Visiting Login Page: #{site.login.path}"
self.then ->
self.then ->
@evaluate (ufield,user,pfield,pass)->
jQuery(ufield).val(user)
jQuery(pfield).val(pass)
,
ufield: site.login.form.username.element
user: site.login.form.username.value
pfield: site.login.form.password.element
pass: site.login.form.password.value
self.then ->
@echo "Added formdata"
self.then ->
@click "#{site.login.form.element} #{site.login.form.submit}"
self.then ->
@echo "Submitted form"
self.then ->
@waitUntilVisible site.login.form.wait.element, ->
@echo 'Page Loaded'
, ->
@echo "Login Failed"
@exit 1
, max_timeout
self.each keys, (self, skey)->
self.thenOpen site.search.path,
method: "get"
data: site.login.getdata
, ->
@echo "Visiting Search Page: #{site.search.path}, for #{skey}"
self.then ->
@echo @page.content
@waitUntilVisible "#{site.search.form.element} #{site.search.form.query.element}"
, ->
@echo "Search Form Visible"
, ->
@echo "Search Visit Failed"
@exit 1
, max_timeout
self.then ->
@evaluate (key, feild)->
jQuery(feild).val(key)
,
key: skey
feild: site.search.form.query.element
self.then ->
@echo "Added searchdata"
self.then ->
@click "#{site.search.form.element} #{site.search.form.submit}"
self.then ->
@echo "Submited Search"
self.then ->
@waitUntilVisible site.search.form.wait.element
, ->
@echo "Search Results Visible"
, ->
@echo "Search Failed"
@exit 1
, max_timeout
self.then ->
result_links = @evaluate (linktag)->
res = []
res_els = __utils__.findAll(linktag)
Array.prototype.forEach.call res_els, (e)->
href = e.getAttribute("href")
label = jQuery(e).text()
res.push {href: href, label: label} if href?
res
,
linktag: "#{site.search.threads.element} #{site.search.threads.link.element}"
self.then ->
utils.dump result_links
search_results[site.title][skey] = result_links
失敗に関係するコンソール出力は次のとおりです。
[debug] [phantom] opening url: http://www.cyclingforums.com, HTTP GET
[debug] [phantom] Navigation requested: url=http://www.cyclingforums.com/, type=Other, lock=true, isMainFrame=true
[debug] [phantom] url changed to "http://www.cyclingforums.com/"
[debug] [phantom] Automatically injected jquery.min.js client side
[debug] [phantom] Successfully injected Casper client-side utilities
[info] [phantom] Step 50/68 http://www.cyclingforums.com/ (HTTP 200)
Visiting Search Page: http://www.cyclingforums.com, for track
[info] [phantom] Step 50/68: done in 63268ms.
[info] [phantom] Step 51/68 http://www.cyclingforums.com/ (HTTP 200)
<html><head></head><body></body></html>
[info] [phantom] Step 51/68: done in 63352ms.
[info] [phantom] Step 52/69 http://www.cyclingforums.com/ (HTTP 200)
[info] [phantom] Step 52/69: done in 63452ms.
[warning] [phantom] Casper.waitFor() timeout
Search Visit Failed
ページが空のページで応答するのはなぜですか?
編集: 他のサイトでのテストを通じて、基本コードは機能しているように見えますが、この 1 つのサイトが問題を引き起こしているようです。