2015-12-24 11 views
8

Otrzymuję ten denerwujący element nie jest widoczny wyjątek przy użyciu selenu Pythona, podczas gdy element jest aktywny, wybrany i miga.ElementNotVisibleException: Wiadomość: Element nie jest obecnie widoczny ... selen (python)

Kwestia jest na stronie, aby zrobić jfiddle, więc zamiast tworzyć skrzypce samego fiddle tutaj jest cięcie i wklejanie sposobu logowania i mieć webdriver (o nazwie "sterownik") w swoim terminalu ipython (wprowadzić nazwę użytkownika i hasło do ipython, a nie strona):

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

teraz jest kierowca i jesteś zalogowany do jsfiddle, wszystko co robię tutaj nie wyjątkiem picking BOX raz pierwszy (powiedzmy Chcę upuścić CSS w polu CSS):

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

Wklej activate_hidden_element i pierwszą linią kodowania i zobacz panel CSS. Z jakiegoś powodu ten podświetlony panel jest "niewidoczny" i nie można go wkleić ani kodować. Element to

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

Wszystkie pozostałe elementy (HTML, JS) są w zasadzie takie same. Dlaczego to aktywne pole nie pozwala na wklejenie tekstu? Dziękuję

ROZWIĄZANIE:

brzydki sposób zrobiłem ten prac serwisowych było ręcznie fałszywy kopiowania i wklejania:

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

To działa, tylko drobny problem to nie może działać w tle, muszę zostawić ekran sam na około 30 sekund

+0

Ostatecznym celem jest wypełnienie textarea, zgadza się? –

+0

yessir, być w stanie wypełnić wszystkie te obszary tekstowe html, css i javascript – codyc4321

Odpowiedz

9

Edytory JSFiddle są zasilane przez CodeMirror, który ma programowy sposób ustawiania wartości edytora .

Dla każdego JSFiddle edytorze należy umieścić wartości w zlokalizuj element z klasy CodeMirror, uzyskać obiektu CodeMirror i nazywają setValue():

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, za pomocą panelu JS wykonujący alert("Test"); Kod Javascript:

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

Produkuje:

enter image description here

+0

jak na Ziemi mogłeś to wiedzieć :) dzięki – codyc4321

+0

Potrzebuję czegoś takiego do mojego własnego projektu, wydaje się, że jest open source. doceń to alex – codyc4321