2009-05-03 18 views
9

के साथ एक छवि को सहेजने के लिए मैं सेलेनियम सर्वर & पायथन क्लाइंट का उपयोग कर वेबसाइट से एक छवि को सहेजने की कोशिश कर रहा हूं। मुझे छवि का यूआरएल पता है, लेकिन मुझे इसे सहेजने के लिए कोड नहीं मिल रहा है, या तो जब यह दस्तावेज़ स्वयं होता है, या जब यह वर्तमान ब्राउज़र सत्र में एम्बेडेड होता है।सेलेनियम और फ़ायरफ़ॉक्स

मुझे अब तक जो कामकाज मिला है वह पृष्ठ के स्क्रीनशॉट को सहेजना है (केवल उसमें करने के लिए 2 सेलेनियम विधियां हैं), लेकिन मुझे मूल छवि चाहिए।

मुझे क्लिक मेनू विकल्प आदि के साथ झुकाव नहीं है लेकिन मुझे नहीं मिला।

धन्यवाद

+0

यह लंबे समय से रहा है, लेकिन मुझे आश्चर्य है, क्या आपको कोई समाधान मिला? – johnjohn

+0

नहीं, मेरे पास नहीं है .. –

+0

मेरे पास इसका समाधान है। मैंने सेलेनियम के usercript.js को बढ़ाया। Userpref.js में स्क्रीनशॉट को कैप्चर करने के लिए फ़ायरफ़ॉक्स के अधिकारों का विस्तार किया और स्क्रीन पर कब्जा करने और सर्वर को छवि डेटा भेजने के लिए स्कॉट Szretter के समान कुछ इस्तेमाल किया। – powtac

उत्तर

-1

कैसे चित्र URL के लिए जा रहा है और फिर पेज के एक स्क्रीनशॉट लेने के बारे में? फ़ायरफ़ॉक्स पूरी स्क्रीन में छवि प्रदर्शित करता है। आशा है कि इस मदद करता है ..

+0

जैसा कि मैंने पहले ही लिखा है, यह मेरा वर्तमान कामकाज है। –

0

मैं सेलेनियम उपयोग नहीं किया है, लेकिन आप छवि के URL, क्यों सिर्फ ऐसा नहीं पता है:

from urllib import urlretrieve 

urlretrieve(url, filename) 

जो फ़ाइल नाम के यूआरएल बचत होगी। अधिक जानकारी here

+4

क्योंकि छवि को सहेजना सत्र पर निर्भर करता है। पहली जगह सेलेनियम का कारण वास्तविक वातावरण पर परीक्षण कर रहा है। सर्वर को वास्तव में यूआरएल मिल जाता है, लेकिन यह तय करने से पहले सत्र से संबंधित कई पर्यावरण चर को पार करता है कि कौन सी छवि वितरित करने के लिए, यदि कोई हो! –

+0

तो, शायद आप सेलेनियम से कुकीज़ प्राप्त कर सकते हैं और अनुरोध में उन्हें पास करने के लिए urllib2 का उपयोग कर सकते हैं? –

+3

सत्र केवल कुकीज़ से अधिक है, और इसे urrlib2 में नकल करने के लिए, सेलेनियम आरसी की नकल करने का मतलब है, तो मैं पहली जगह सेलेनियम का उपयोग क्यों करूं ?? –

3

इस तरह से आप चाहते हैं ऐसा करने के लिए (वास्तव में सामग्री पर कब्जा करने के लिए ब्राउज़र को नीचे भेजा) आप और पर स्थानीय रूप से फ़ाइलों को स्टोर सेलेनियम आर सी के प्रॉक्सी कोड (ProxyHandler.java देखें) संशोधित करने की आवश्यकता होगी ब्राउज़र पर प्रतिक्रिया भेजने के समानांतर में डिस्क।

+0

यह ... दिलचस्प है। लेकिन फिर यह सभी फाइलों को सहेज लेगा, और मुझे लगता है कि कौन सी फाइल समय के साथ संबंधित है, जावा का थोड़ा सा सीखने के लिए नहीं। लेकिन यह एक संभावित समाधान है। –

2

मैं एक ही कार्य को पूरा करने की कोशिश कर रहा था, लेकिन जिन छवियों को मैं पकड़ना चाहता था वे मेरे मॉनीटर (वॉलपेपर) का आकार थे - इसलिए कैप्चर स्क्रीनशॉट वर्कअराउंड मेरे लिए काम नहीं करता था। मैंने इसे करने का एक तरीका निकाला ...

मुझे उस पृष्ठ पर जाने के लिए सेलेनियम स्थापित किया गया है जो मुझे चाहिए (जो सभी सत्र उपहारों को प्रेरित करता है) फिर मैंने लूप को "वर्कस्पेस मैक्रो" नामक एक प्रोग्राम का उपयोग किया सेलेनियम कार्यों के माध्यम से।

इसे यहां से देखें http://www.tethyssolutions.com/product.htm - उनके पास एक परीक्षण संस्करण है, जो मुझे लगता है कि 30 रन या कुछ के लिए काम करता है।

तो यहाँ प्रगति है:

  • शुरू फ़ायरफ़ॉक्स
  • खुला सेलेनियम और लोड परीक्षण मामले
  • इसे शुरू, लेकिन जल्दी इसे रोक सकते हैं।
  • रिकॉर्ड एक मैक्रो है, जो सेलेनियम पर "कदम" भेजता है, तो फ़ायरफ़ॉक्स खिड़की के लिए खत्म हो जाता है और क्लिक करता है फ़ाइल> पेज बचाने के लिए, के रूप में बचत होती है, तो रिकॉर्डिंग
  • मैक्रो एक्स बार चलाने रोक ...
  • फायदा??

चीयर्स

5

मैं कोड है कि एक कैनवास में एक छवि डालता पाया है, तो डेटा में बदल देता है - जो तब उदाहरण के लिए इनकोडिंग बेस 64 हो सकता है। मेरा विचार था कि सेलेनियम में eval कमांड का उपयोग करके इसे कॉल करना था, हालांकि मेरे परीक्षण में toDataURL एक सुरक्षा त्रुटि 1000 फेंक रहा है। ऐसा लगता है कि अगर उस त्रुटि के लिए यह समाधान के बहुत करीब है।

var data, canvas, ctx; 
var img = new Image(); 
img = document.getElementById("yourimageID"); 
canvas = document.createElement('canvas'); 
canvas.width = img.width; 
canvas.height = img.height; 
ctx = canvas.getContext("2d"); 
ctx.drawImage(img, 0, 0); // everything works up to here 
data = canvas.toDataURL(); // this fails *** 
var base64Img = data.replace(/^data:image\/(png|jpg);base64,/, ""); 

कुछ शोध मैं संदर्भ है कि यह toDataURL उपयोग करने के लिए जब छवि एक अलग डोमेन से है अनुमति नहीं है पाया करने से। हालांकि, मैंने पृष्ठ को सहेजकर इस कोड को भी कोशिश की, छवि को स्वयं और इस स्क्रिप्ट को छोड़कर सब कुछ अलग कर दिया।

उदाहरण (index.html) के लिए:

<html><head></head><body> 
<img src="local/hard/disk/img.jpg" id="yourimageID"> 
<script> 
// script from above 
</script> 
</body></html> 

img.jpg और index.html स्थानीय रूप से संग्रहीत कर रहे हैं, स्थानीय स्तर पर फ़ायरफ़ॉक्स में पेज खोलने, अभी भी एक सुरक्षा त्रुटि 1000 प्राप्त करें!

+0

पूरी तरह से महान विचार! क्या आपको सुरक्षा ब्लॉक को बाईपास करने का कोई तरीका मिला? – johnjohn

संबंधित मुद्दे