2015-12-24 3 views
8

Öğe etkin, seçili ve yanıp sönerken, bu can sıkıcı öğenin python'un selenyumunu kullanarak görünmez bir istisna olmadığını görüyorum.ElementNotVisibleException: İleti: Öğe şu anda görünmüyor ... selenium (python)

Sorun bir jfiddle yapmak için sayfada, bu yüzden kemanın bir kemanı yapmak yerine, giriş yapmak için bir kesme ve yapıştırma yoludur ve ipython terminalinizde bir web sürücüsü ('sürücü' olarak adlandırılır) var (ipython içine kullanıcı adı ve şifre girmek değil, sayfa):

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

Şimdi orada bir sürücü olduğunu ve jsfiddle giriş yapmış olduğunuz, burada yaptığınız her şey kutusunu ilk kez çekme dışında başarısız (diyelim CSS kutusuna CSS kutusuna bırakmak istiyorum): https://gist.github.com/codyc4321/f4c03c0606c2e3e4ff5b

activate_hidden_element ve ilk kodlamayı yapıştırın ve CSS panelinin yanmasını sağlayın. Bazı nedenlerden dolayı, bu vurgulanan panel 'görünür değil' ve yapıştırıp kod yazamıyorsunuz. Öğe, diğer öğeler (HTML, JS) esas olarak aynıdır. Bu aktif kutu neden metnin yapıştırılmasına izin vermiyor? Teşekkürler

ÇÖZÜM:

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") 

O çalışır, sadece küçük bir konudur bu koşamam: Bu hizmet işi yapılmış çirkin bir yol elle sahte bir kesme ve yapıştırma oldu

arka planda, ekranı 30 saniye boyunca yalnız bırakmam gerekiyor

+0

nihai hedef bu doğru, textarea doldurmaktır? –

+0

yessir, html, css ve javascript – codyc4321

cevap

9

JSFiddle editörleri, tarafından desteklenmekte olup, editör değerlerini ayarlamak için programatik bir yol vardır. alert("Test"); infaz JS panelini kullanarak,

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") 

Demo: Eğer içine değerlerini koymak bir CodeMirror sınıfla eleman bulmak için gereken her JSFiddle editörü için

, CodeMirror nesneyi almak ve setValue() çağrı Javascript kodu:

>>> 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() 
>>> 

Bu üretir:

enter image description here

+0

tüm bu metin alanları doldurabildiğini bilmeliydiniz, nasıl olduğunu biliyordunuz :) teşekkürler – codyc4321

+0

Kendi projem için buna benzer bir şeye ihtiyacım var, açık kaynak gibi görünüyor. takdir et alex – codyc4321