我正在使用python的selenium获取那些恼人的元素是不可见的异常,而元素是活动的,选择的和闪烁的.
问题是在页面上制作一个jfiddle,所以这里不是制作小提琴本身,而是在你的ipython终端登录并拥有一个webdriver(名为'driver')的切割和粘贴方式(输入用户名和密码)进入ipython,而不是页面):
https://gist.github.com/codyc4321/787dd6f62e71cc71ae83
现在有一个驱动程序,你登录jsfiddle,我在这里做的一切都失败了,除了第一次选择框(让我说我想把CSS放在CSS框中):
https://gist.github.com/codyc4321/f4c03c0606c2e3e4ff5b
粘贴activate_hidden_element
并在第一个代码行中看到CSS面板亮起.出于某种原因,这个突出显示的面板"不可见",您无法粘贴和编码.该项目是
所有其他项目(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秒
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")
演示,使用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() >>>
它产生: