2015-12-24 5 views
8

Я получаю, что этот раздражающий элемент не является видимым исключением с использованием селена python, в то время как элемент активен, выбран и мигает.ElementNotVisibleException: Message: Элемент в настоящее время не виден ... selenium (python)

Проблема заключается в том, чтобы сделать jfiddle, поэтому вместо того, чтобы делать скрипку самой скрипки, здесь вырезать и вставлять способ входа в систему и иметь webdriver (с именем «driver») в вашем ipython-терминале (например, введите имя пользователя и пароль в IPython, а не страницы):

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

Теперь есть драйвер и вы вошли в jsfiddle, что я делаю здесь не удается, кроме выбора коробки в первый раз (скажем, Я хочу сбросить CSS в поле CSS):

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

Вставить activate_hidden_element и первую кодолингу и увидеть панель CSS. По какой-то причине эта выделенная панель «не видна», и вы не можете вставлять и кодировать ее. Товар является

<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, сможете заполнить все эти текстовые области html, css и javascript – codyc4321

ответ

9

Редакторы JSFiddle рассчитаны на использование CodeMirror, который имеет программный способ для установки значений редакторов .

Для каждого редактора JSFiddle вам необходимо поместить значения в, найти элемент с CodeMirror класса, получить CodeMirror объект и вызвать 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, с помощью JS панели выполняющийся в alert("Test"); 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() 
>>> 

Он производит:

enter image description here

+0

как на Земле вы могли бы знать это :) спасибо – codyc4321

+0

Мне нужно что-то подобное для моего собственного проекта, кажется, что это с открытым исходным кодом. оцените его alex – codyc4321

Смежные вопросы