python Selenium send_keys到Jupyter笔记本?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (476)

我试图在python中使用selenium自动输入Jupyter笔记本。

我试图使用send_keys()方法与DOM中的各种元素,我迄今为止尝试的所有元素都有以下问题:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <span> is not reachable by keyboard

到目前为止,我尝试了返回以下元素的定位器:

  • ('tag name','textarea')[但是,这是隐藏的,因此无法互动]
  • ('class','CodeMirror-code')元素下的''tag name','pre')
  • ('class','CodeMirror-code')元素下的''tag name','span')
  • (上面的跨度下的'标签名称','span')

input在DOM中没有明显的可见。有没有人试图自动化Jupyter笔记本?

看来,当手动输入屏幕上的textarea时,DOM会动态地改变span下面的元素......

以下是我正在使用的DOM的相关部分以及textarea的屏幕截图

<div class="cell code_cell rendered selected" tabindex="2">
   <div class="input">
      <div class="run_this_cell" title="Run this cell"><i class="fa-step-forward fa"></i></div>
      <div class="prompt input_prompt"><bdi>In</bdi>&nbsp;[&nbsp;]:</div>
      <div class="inner_cell">
         <div class="ctb_hideshow">
            <div class="celltoolbar"></div>
         </div>
         <div class="input_area">
            <div class="CodeMirror cm-s-ipython">
               <div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 5.59375px; left: 5.59375px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div>
               <div class="CodeMirror-vscrollbar" cm-not-content="true">
                  <div style="min-width: 1px; height: 0px;"></div>
               </div>
               <div class="CodeMirror-hscrollbar" cm-not-content="true">
                  <div style="height: 100%; min-height: 1px; width: 0px;"></div>
               </div>
               <div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div>
               <div class="CodeMirror-gutter-filler" cm-not-content="true"></div>
               <div class="CodeMirror-scroll" tabindex="-1">
                  <div class="CodeMirror-sizer" style="margin-left: 0px; min-width: 8.59375px; margin-bottom: -15px; border-right-width: 15px; min-height: 28px; padding-right: 0px; padding-bottom: 0px;">
                     <div style="position: relative; top: 0px;">
                        <div class="CodeMirror-lines" role="presentation">
                           <div role="presentation" style="position: relative; outline: none;">
                              <div class="CodeMirror-measure"></div>
                              <div class="CodeMirror-measure"></div>
                              <div style="position: relative; z-index: 1;"></div>
                              <div class="CodeMirror-cursors" style="visibility: hidden;">
                                 <div class="CodeMirror-cursor" style="left: 5.59375px; top: 0px; height: 17px;">&nbsp;</div>
                              </div>
                              <div class="CodeMirror-code" role="presentation">
                                 <pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre>
                              </div>
                           </div>
                        </div>
                     </div>
                  </div>
                  <div style="position: absolute; height: 15px; width: 1px; border-bottom: 0px solid transparent; top: 28px;"></div>
                  <div class="CodeMirror-gutters" style="display: none; height: 43px;"></div>
               </div>
            </div>
         </div>
      </div>
   </div>
   <div class="output_wrapper">
      <div class="out_prompt_overlay prompt" title="click to expand output; double click to hide output"></div>
      <div class="output"></div>
      <div class="btn btn-default output_collapsed" title="click to expand output" style="display: none;">. . .</div>
   </div>
</div>
提问于
用户回答回答于

我认为问题是你试图在不是文本输入或textarea的元素上使用sendKeys()。

而是在单击目标元素后尝试使用Actions:

Actions builder = new Actions(driver);
builder.SendKeys("My input").Perform();

我在jsfiddle.net上测试了这个(它也没有使用标准的textarea)并且它有效。

扫码关注云+社区

领取腾讯云代金券