2015-12-24 6 views
8

मुझे उन परेशान तत्वों को पाइथन के सेलेनियम का उपयोग करके अपवाद दिखाई नहीं दे रहा है, जबकि तत्व सक्रिय, चयनित और चमक रहा है।ElementNotVisibleException: संदेश: तत्व वर्तमान में दिखाई नहीं दे रहा है ... सेलेनियम (पायथन)

यह समस्या पृष्ठ पर है, जो कि एक पहेली बनाने के लिए है, इसलिए यहां खुद को बेवकूफ़ बनाने का बजाए लॉग इन करने के लिए एक कट और पेस्ट तरीका है और आपके आईपीथॉन टर्मिनल में एक वेबड्राइवर (नाम 'ड्राइवर') है (IPython में उपयोगकर्ता नाम और पासवर्ड दर्ज करें, नहीं पेज):

https://gist.github.com/codyc4321/787dd6f62e71cc71ae83

अब तक एक ड्राइवर है और आप jsfiddle में प्रवेश कर लिया, सब कुछ मैं यहाँ कर बॉक्स पहली बार उठा छोड़कर विफल रहता है (मान लें मैं सीएसएस बॉक्स में सीएसएस छोड़ना चाहता हूं):

https://gist.github.com/codyc4321/f4c03c0606c2e3e4ff5b

पेस्ट activate_hidden_element और पहली कोडलाइन और सीएसएस पैनल लाइट अप देखें। किसी कारण से, यह हाइलाइट किया गया पैनल 'दृश्यमान नहीं' है, और आप इसमें पेस्ट और कोड नहीं कर सकते हैं। आइटम

<div class="window top" id="panel_css" data-panel_type="css"> 
    <textarea id="id_code_css" rows="10" cols="40" name="code_css"></textarea> 
    <a href="#" class="windowLabel" data-panel="css"> 
     <span class="label">CSS</span><i class="bts bt-gear"></i> 
    </a> 
    </div> 

अन्य सभी आइटम (HTML, JS) अनिवार्य रूप से वही हैं। यह सक्रिय बॉक्स टेक्स्ट को पेस्ट करने की अनुमति क्यों नहीं देगा? धन्यवाद

समाधान:

बदसूरत तरह से मैं इस सेवा का काम किया जाता मैन्युअल नकली एक कट और पेस्ट करने के लिए था: यह नहीं चल सकता

css_content = get_inline_content_and_remove_tags(webpage_content, 'style') 

js_content = get_inline_content_and_remove_tags(webpage_content, 'script') 

webpage_content = # ...clean cruft... 

def copy_paste_to_hidden_element(content=None, html_id=None): 
    pyperclip.copy(content) 
    activate_hidden_element(html_id=html_id, driver=driver) 
    call_sp('xdotool key from+ctrl+v') 
    time.sleep(1) 

copy_paste_to_hidden_element(content=webpage_content, html_id="panel_html") 
copy_paste_to_hidden_element(content=js_content, html_id="panel_js") 
copy_paste_to_hidden_element(content=css_content, html_id="panel_css") 

यह काम करता है, केवल मामूली मुद्दा है पृष्ठभूमि में, मुझे लगभग 30 सेकंड

+0

अंतिम लक्ष्य टेक्स्टरेरा भरना है, यह सही है? –

+0

yessir, उन सभी टेक्स्ट क्षेत्रों को भरने में सक्षम हो, एचटीएमएल, सीएसएस, और जावास्क्रिप्ट – codyc4321

उत्तर

9

JSFiddle संपादकों को CodeMirror द्वारा संचालित किया गया है, जिसमें संपादक मान सेट करने के लिए प्रोग्रामेटिक तरीका है। जे एस पैनल alert("Test"); को क्रियान्वित करने का उपयोग कर

css_panel = driver.find_element_by_id("panel_css") 

code_mirror_element = css_panel.find_element_by_css_selector(".CodeMirror") 
driver.execute_script("arguments[0].CodeMirror.setValue(arguments[1]);", 
         code_mirror_element, 
         "test") 

डेमो,:

हर JSFiddle संपादक आप में मूल्यों डाल करने के लिए, एक CodeMirror वर्ग के साथ तत्व का पता लगाने की जरूरत है के लिए, CodeMirror वस्तु मिलता है और फोन setValue() जावास्क्रिप्ट कोड:

>>> from selenium import webdriver 
>>> 
>>> driver = webdriver.Firefox() 
>>> driver.get("https://jsfiddle.net/user/login/") 
>>> driver.find_element_by_id("id_username").send_keys("user") 
>>> driver.find_element_by_name("password").send_keys("password") 
>>> driver.find_element_by_xpath("//input[@value = 'Log in']").click() 
>>> 
>>> driver.get("https://jsfiddle.net/") 
>>> 
>>> js_panel = driver.find_element_by_id("panel_js") 
>>> 
>>> code_mirror_element = js_panel.find_element_by_css_selector(".CodeMirror") 
>>> driver.execute_script("arguments[0].CodeMirror.setValue(arguments[1]);", code_mirror_element, "alert('test');") 
>>> 
>>> driver.find_element_by_id("run").click() 
>>> 

यह उत्पादित करता है:

enter image description here

+0

पृथ्वी पर आप कैसे जानते थे :) धन्यवाद – codyc4321

+0

मुझे अपनी परियोजना के लिए ऐसा कुछ चाहिए, ऐसा लगता है कि यह खुला स्रोत है। एलेक्स की सराहना करते हैं – codyc4321

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