2016-03-26 11 views
5

नोट: सेलेनियम के लिए सेलेनियम या एपीआई रैपर स्प्लिंटर में एक समाधान ठीक है!स्प्लिंटर/सेलेनियम का उपयोग करके आईफ्रेम के साथ बातचीत [पायथन]

मुझे पाइथन के लिए स्प्लिंटर एपीआई का उपयोग करके ट्विटर.com पर आईफ्रेम के साथ बातचीत करने में समस्याएं आ रही हैं।

उदाहरण के लिए,

with Browser('firefox', profile_preferences= proxySettings) as browser: 
    #...login and do other stuff here 
    browser.find_by_id('global-new-tweet-button').click() 

इस ट्वीट में टाइप करने के लिए एक पॉप-अप बॉक्स को लाता है।

मैं कैसे करने के लिए किरच का उपयोग कर इस नए बॉक्स के साथ बातचीत करते हैं: 1) संदेश 2) पर क्लिक करें "ट्वीट" में भरने (प्रस्तुत) ..programmatically के पाठ्यक्रम।

मैंने तत्व का निरीक्षण करने की कोशिश की लेकिन यह एक आईफ्रेम के अंदर घोंसला नहीं लग रहा है, हालांकि यह एक आईफ्रेम को लक्षित करता है। तो मुझे यकीन नहीं है कि इस पॉप-अप में तत्वों को कैसे ढूंढें/कैसे बातचीत करें।

मैं मैन्युअल रूप से संदेश में टाइप तो प्रोग्राम के रूप में ट्वीट बटन पर क्लिक की कोशिश की:

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with 
Stacktrace: 
    at fxdriver.preconditions.visible (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:10092) 
    at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12644) 
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12661) 
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12666) 
    at DelayedCommand.prototype.execute/< (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12608) 

मैं सख्ती से किरच इसलिए का उपयोग कर अपने लक्ष्य को हासिल करना चाहते हैं:

browser.find_by_css('.btn.primary-btn.tweet-action.tweet-btn.js-tweet-btn').click() 

..लेकिन मैं त्रुटि मिलती है कृपया विकल्पों की पेशकश न करें, मुझे पता है कि अन्य तरीके भी हैं। अग्रिम धन्यवाद!

उत्तर

0

आपको प्राथमिक समस्या यह प्रतीत होती है कि आप तत्व वस्तु के रूप में browser.find_by_xxx के परिणामों का इलाज कर रहे हैं, जब वास्तव में यह एक तत्व कंटेनर ऑब्जेक्ट (यानी वेबड्राइवर तत्वों की एक सूची) है।

In [51]: elems = browser.find_by_id('tweet-box-global') 
In [52]: len(elems) 
Out[52]: 1 
In [53]: elems[0].fill("Splinter Example") 
In [54]: 

वह मेरे लिए लिखेंगे "किरच उदाहरण" क्षेत्र में:

क्षेत्र के लिए लेखन अगर मैं तत्व स्पष्ट संदर्भ मेरे लिए काम करता है।

बटन क्लिक विफल हो रहा है क्योंकि आपका सीएसएस पथ तीन तत्वों की एक सूची लौटा रहा है, और आप निहित तत्व पर छिपे हुए तत्व पर क्लिक कर रहे हैं। मेरे परीक्षण में, तत्व आप वास्तव में पर क्लिक करें सूची में दूसरा तत्व है:

In [26]: elems = browser.find_by_css('.btn.primary-btn.tweet-action.tweet-btn.js-tweet-btn') 
In [27]: len(elems) 
Out[27]: 3 
In [28]: elems[1].click() 
In [29]: 

जब मैं स्पष्ट रूप से दूसरा तत्व क्लिक करें यह एक त्रुटि फेंक नहीं है और बटन क्लिक किया जाता है।

आप सीएसएस पथ आप दिखाई मोडल में केवल बटन के परिणामों को सीमित कर सकते हैं करने के लिए जोड़ देते हैं तो:

In [42]: css_path = "div.modal-tweet-form-container button.btn.primary-btn" 
In [43]: elems = browser.find_by_css(css_path) 
In [44]: len(elems) 
Out[44]: 1 
In [45]: elems.click() 
In [46]: 

ध्यान दें कि कोई अपवाद नहीं यहां फेंक दिया गया था।

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