2012-03-16 31 views
7

Tôi chỉ quen với PhantomJ và cho đến nay nó thực sự rất tuyệt.PhantomJs nhấp vào liên kết hoặc chạy các chức năng trên trang

Tôi đang cố thu thập dữ liệu trang web và nhận dữ liệu về các sản phẩm trên trang web. Mỗi trang sản phẩm tải với màu mặc định của sản phẩm hiển thị. Khi bạn bấm vào một mẫu màu, nó hoán đổi màu mới bằng cách chạy một hàm. Mỗi phần tử mẫu màu có thể nhấp có dạng như sau:

<input type="image" id="swatch_0" onclick="pPage.getColor(0);" src="http://www.site.com/img50067.jpg"> 

getColor cập nhật hình thu nhỏ và giá cho màu đó. Giá trị gia tăng của id cho mỗi màu có sẵn (swatch_0, swatch_1, v.v.) và đối số cũng được chuyển đến số tăng getColor. Tôi muốn lặp qua từng màu với PhantomJ và kéo dữ liệu liên quan cho mỗi màu.

Tôi đã tải trang, nạp jQuery và có thể kéo dữ liệu cho màu được tải đầu tiên, nhưng dường như không có gì cho phép tôi thực thi các sự kiện nhấp chuột.

đây là những gì tôi đang cố gắng:

page.evalaute(function){ 
    var selection = $('#confirmText').text(); // name of the color 
    var price = $('#priceText').text();  // price for that color 

    console.log('Price is: ' + price); 
    console.log('Selection is: ' + selection); 
    console.log($('#swatch_1')); 

    $('#swatch_1').trigger("click"); 

    selection = $('#selectionConfirmText').text(); 
    price = $('#priceText').text(); 
    console.log('Price is: ' + price); 
    console.log('Selection is: ' + selection); 

} 

này mang lại cho tôi:

console> Price is: $19.95 
console> Selection is: blue 
console> [Object Object] 
console> TypeError: 'undefined' is not and object // repeating until I manually exit 

không có mã khác chạy. Tôi cũng đã cố gắng bắn sự kiện mà không cần jQuery như thế này:

var evt = document.createEvent("MouseEvents"); 
evt.initMouseEvent("click", true, true, window, 
0, 0, 0, 0, 0, false, false, false, false, 0, null); 
var cb = document.getElementById("swatch_1"); 
cb.dispatchEvent(evt); 

Và chạy chức năng trực tiếp:

pPage.getColor(1); 

Và tôi nhận được đầu ra tương tự. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

3

Nếu xử lý onclick được quy định trực tiếp trong HTML là bạn có nó ở đây, bạn có thể gọi nó là trực tiếp với Javascript:

$(function() { 
    $('#swatch_0')[0].onclick(); 
}); 

Tôi tin rằng bạn cũng có thể sử dụng PhantomJS page phương pháp sendEvent() phát hành sự kiện nhấp chuột gốc. Nhưng có vẻ như đây là một chút phức tạp, vì bạn phải gọi nó từ ngữ cảnh PhantomJS với vị trí x, y của con chuột. đang chưa được kiểm tra:

var elementOffset = page.evaluate(function() { 
    return $('#swatch_1').offset(); 
}); 
page.sendEvent('click', elementOffset.left + 1, elementOffset.top + 1); 
+0

bạn có chắc onClick là một sự kiện jQuery không? Tôi không thể tìm thấy tài liệu về nó. Sự hiểu biết của tôi là .click() sẽ liên kết sự kiện với phần tử, nhưng bạn vẫn phải nhấp vào nó. Tôi chưa thử gửiEEvent. Điều đó có vẻ đầy hứa hẹn. Đối với dự án cụ thể này, tôi quyết định đi một con đường khác. Im sử dụng iMacros để xóa dữ liệu trang. Nó sử dụng một trình duyệt thực tế, vì vậy Ajax và Javascript không phải là một vấn đề. Cảm ơn! –

+0

'onclick' không phải là sự kiện jQuery - đó là phương thức gốc trên phần tử DOM (đó là lý do tại sao ví dụ của tôi sử dụng' $ (...) [0].onclick' - '[0]' nhận phần tử DOM thực tế, không phải là đối tượng jQuery). Điều này sẽ không hoạt động trong nhiều trường hợp, nhưng nó hoạt động khi 'onclick' được đưa vào đánh dấu HTML. – nrabinowitz

+2

BTW - bạn cũng có thể xem xét Selenium cho loại cào dựa trên trình duyệt này. Nó khá tốt, cũng sử dụng một trình duyệt thực sự, và có các ràng buộc cho một loạt các ngôn ngữ khác. – nrabinowitz

1

không có nhiều hoạt động ở đây một vài tháng, nhưng tôi đã làm việc với công cụ này thời gian gần đây và có lẽ đây là một câu trả lời cho câu hỏi của bạn

nếu jquery đã được nạp như một phần của trang bạn đang chạy, sau đó tiêm jquery sẽ không hoạt động, bạn sẽ nhận được hành vi mà bạn mô tả (tôi cũng gặp phải điều này).

Vì vậy, khi bạn chèn mã jquery, trước tiên bạn phải chắc chắn rằng nó không phải là một phần của bối cảnh

Các vấn đề liên quan