javascript - ElementNotVisibleException : Message: Element is not currently visible. .. Selenium ( python )

标签 javascript python selenium selenium-webdriver

我在使用 python 的 selenium 时遇到了那些烦人的元素不可见异常,而元素处于事件状态、已选中和闪烁状态。

问题出在制作 jfiddle 的页面上,因此这里不是制作 fiddle 本身的 fiddle ,而是一种剪切和粘贴的方式来登录并在您的 ipython 终端中拥有一个 webdriver(名为“driver”)(输入用户名和密码到 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 秒

最佳答案

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

关于javascript - ElementNotVisibleException : Message: Element is not currently visible. .. Selenium ( python ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456584/

相关文章:

javascript - 如何将 JavaScript 数组信息导出到 csv(在客户端)?

c# - Ajax 发送到 C# 代码

java - Selenium 网络驱动程序 : how to verify that there is a heading titled “Download” on the page wrapped in <h2> tags?

java - WebDriver 特定标签

java - 无法找到我从 Chrome 浏览器的检查窗口中看到的带有 Selenium 的 WebElements

javascript - 渐进增强 - Node.js, Backbone.js

javascript - 使用 Mailgun 和 Node.js 批量发送电子邮件

python - 如何编写一个 python 函数来最大化给定 2N X 2N 矩阵中 N X N 左上子矩阵的总和?

python - 如何对txt文件中的每一行执行一条命令

java - 不使用 MNIST 的 Tensorflow 初学者示例