GVKun编程网logo

如何在iframe中的Rich Text编辑器中使用SendKeys(webdriver)命令(iframe script)

23

对于如何在iframe中的RichText编辑器中使用SendKeys感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webdriver命令,并为您提供关于fromselenium.webdri

对于如何在iframe中的Rich Text编辑器中使用SendKeys感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webdriver命令,并为您提供关于from selenium.webdriver.common.keys import Keys、java – Selenium WebDriver:无法使用TinyMCE编辑器在iframe中找到元素、javascript – 如何使用Selenium WebDriver访问动态添加的iframe?、javascript – 无法使用Selenium Webdriver中的send_keys上传文件的有用信息。

本文目录一览:

如何在iframe中的Rich Text编辑器中使用SendKeys(webdriver)命令(iframe script)

如何在iframe中的Rich Text编辑器中使用SendKeys(webdriver)命令(iframe script)

我面临以下问题。我无法在其中有文本编辑器的iframe中键入文本:这是html:

<iframeframeborder="0"aria-describedby="cke_39" title="Текстов редактор за форматиран текст,description1" src="" tabindex="0" allowtransparency="true"><!DOCTYPE html><html lang="bg" dir="ltr"><head><bodycontenteditable="true" spellcheck="false"><p><br></p></body></html></iframe>

到目前为止,这是我所做的,但是测试成功通过,并且文本编辑器中未写入任何文本。可能的解决方案是使用Javascript执行程序,但我对此并不熟悉。

WaitTool.waitForElementPresent(Browser.instance, By.tagName("iframe"), 10);WebElement iframe = Browser.instance.findElement(By.tagName("iframe"));Browser.instance.switchTo().frame(iframe);WebElement description=Browser.instance.findElement(By.xpath("//body[@cke_editable cke_editable_themed cke_contents_ltr'']"));description.click();description.sendKeys("someText");Browser.instance.switchTo().defaultContent();

提前致谢!

答案1

小编典典

有多种实现方法。这是您可能想要看看的文章。

使用Selenium WebDriver测试所见即所得的编辑器

  • 直接发送密钥

这种方法是您尝试过但没有奏效的方法。请务必设法让你的定位程序<iframe><body>正确。否则,我建议使用JavaScriptExecutor更稳定的解决方案。

  • 设置innerHTML

    WaitTool.waitForElementPresent(Browser.instance, By.className(“cke_wysiwyg_frame”), 10);
    WebElement iframe = Browser.instance.findElement(By.className(“cke_wysiwyg_frame”));
    Browser.instance.switchTo().frame(iframe);

    WebElement description = Browser.instance.findElement(By.cssSelector(“body”));
    (JavascriptExecutor)Browser.instance.executeScript(“arguments[0].innerHTML = ‘

    Set text using innerHTML

    ‘“, description);

  • 使用CKEditor的本机API

    // no need to switch iframe
    (JavascriptExecutor)Browser.instance.executeScript(“CKEDITOR.instances.ckeditor.setData(‘

    Native API text

    Editor’)”);

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.common.keys import Keys

[''ADD'', ''ALT'', ''ARROW_DOWN'', ''ARROW_LEFT'', ''ARROW_RIGHT'', ''ARROW_UP'', ''BACKSPACE'', ''BACK_SPACE'', ''CANCEL'', ''CLEAR'', ''COMMAND'', ''CONTROL'', ''DECIMAL'', ''DELETE'', ''DIVIDE'', ''DOWN'', ''END'', ''ENTER'', ''EQUALS'', ''ESCAPE'', ''F1'', ''F10'', ''F11'', ''F12'', ''F2'', ''F3'', ''F4'', ''F5'', ''F6'', ''F7'', ''F8'', ''F9'', ''HELP'', ''HOME'', ''INSERT'', ''LEFT'', ''LEFT_ALT'', ''LEFT_CONTROL'', ''LEFT_SHIFT'', ''META'', ''MULTIPLY'', ''NULL'', ''NUMPAD0'', ''NUMPAD1'', ''NUMPAD2'', ''NUMPAD3'', ''NUMPAD4'', ''NUMPAD5'', ''NUMPAD6'', ''NUMPAD7'', ''NUMPAD8'', ''NUMPAD9'', ''PAGE_DOWN'', ''PAGE_UP'', ''PAUSE'', ''RETURN'', ''RIGHT'', ''SEMICOLON'', ''SEPARATOR'', ''SHIFT'', ''SPACE'', ''SUBTRACT'', ''TAB'', ''UP'', ''__class__'', ''__delattr__'', ''__dict__'', ''__doc__'', ''__format__'', ''__getattribute__'', ''__hash__'', ''__init__'', ''__module__'', ''__new__'', ''__reduce__'', ''__reduce_ex__'', ''__repr__'', ''__setattr__'', ''__sizeof__'', ''__str__'', ''__subclasshook__'', ''__weakref__'']


java – Selenium WebDriver:无法使用TinyMCE编辑器在iframe中找到元素

java – Selenium WebDriver:无法使用TinyMCE编辑器在iframe中找到元素

也许我的问题类似于这个 Selenium WebDriver cannot locate element within an iframe,and throws NoSuchElementException但是我仍然找不到必需的元素.
元素本身看起来:

body id="tinymce"contenteditable="true" onload="window.parent.tinyMCE.get('compose_295_composeEditor').onLoad.dispatch();" dir="ltr">

包含此元素的iframe是:

body id="tinymce"contenteditable="true" onload="window.parent.tinyMCE.get('compose_295_composeEditor').onLoad.dispatch();" dir="ltr">

我试过了

driver.switchTo().frame(10);
driver.switchTo().frame(driver.findElement(By.id("tinymce")));
driver.findElement(By.id("tinymce")).clear();
driver.findElement(By.id("tinymce")).sendKeys("Privet!"); // clear mail text body
driver.switchTo().defaultContent();

但收到错误:

Unable to locate frame: 10

尝试过类似的东西

driver.switchTo().frame(driver.findElement(By.id("tinymce")));

如其他答案所述,但收到NoSuchElement错误.

元素周围的HTML是:

<div>
<div id="compose_295_toolbar_external">
<divhttps://www.jb51.cc/tag/dis/" target="_blank">display: none;">
<div id="compose_295_composeFrame">
<div></div>
<tablecellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div id="compose_295_composeEditorFrame">
<table id="compose_295_shell__text"cellspacing="0" cellpadding="0" bgcolor="" background="">
<tbody>
<tr>
<tr>
<td>
<table id="compose_295_middleTable"cellspacing="0" cellpadding="0">
<tbody>
<tr id="compose_295_middleRow_sht">
<td id="compose_295_shell__text_cell_holder"valign="top">
<tablecellspacing="0" cellpadding="0">
<tbody>
<tr>
<tr>
<td id="compose_295_shell__text_cell"valign="top">
<textarea id="compose_295_composeEditor"wrap="physical" tabindex="10" name="Body"https://www.jb51.cc/tag/dis/" target="_blank">display: none;" cols="80" rows="15" spellcheck="true" aria-hidden="true"> </textarea>
 <span id="compose_295_composeEditor_parent">
 <table id="compose_295_composeEditor_tbl"cellspacing="0" cellpadding="0">
<tbody>
<trhttps://www.jb51.cc/tag/irs/" target="_blank">irst mceLast">
<tdhttps://www.jb51.cc/tag/irs/" target="_blank">irst mceLast">
<iframe id="compose_295_composeEditor_ifr" frameborder="0" src="javascript:""" allowtransparency="true" title="{#aria.rich_text_area}"https://www.jb51.cc/tag/dis/" target="_blank">display: block;" hidefocus="true" tabindex="10" scrolling="auto">
<html>
<head xmlns="http://www.w3.org/1999/xhtml">
<body id="tinymce"contenteditable="true" onload="window.parent.tinyMCE.get('compose_295_composeEditor').onLoad.dispatch();" dir="ltr">
</html>
</iframe>
</td>
</tr>
</tbody>
</table>
</span>
</td>
</tr>
<tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>

UPD Selenium and wordpress: New post test,olyv的回答帮助了我,但是:
1)很难将这个问题与我的问题联系起来,因为它没有在标题中提到TinyMCE编辑器,而且问题不在于wordpress.
2)我编辑了我的问题名称来表明问题来源–TinyMCE编辑器.
3)Saifur的答案在这里完美地回答了我的问题.
所以我相信我的问题不应该被关闭

解决方法

根据html,识别iframe的选择器是不正确的.我正在使用一个cssSelector,它允许您识别具有部分id匹配的iframe.你为什么不尝试这个?

driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[id$='_composeEditor_ifr']")));
d̶r̶i̶v̶e̶r̶.̶s̶w̶i̶t̶c̶h̶T̶o̶(̶)̶.̶f̶r̶a̶m̶e̶(̶d̶r̶i̶v̶e̶r̶.̶f̶i̶n̶d̶E̶l̶e̶m̶e̶n̶t̶(̶B̶y̶.̶i̶d̶(̶"̶t̶i̶n̶y̶m̶c̶e̶"̶)̶)̶)̶;̶
driver.findElement(By.id("tinymce")).clear();
driver.findElement(By.id("tinymce")).sendKeys("Privet!"); // clear mail text body
driver.switchTo().defaultContent();

javascript – 如何使用Selenium WebDriver访问动态添加的iframe?

javascript – 如何使用Selenium WebDriver访问动态添加的iframe?

我有一个没有iframe的页面,然后通过 JavaScript在点击一个锚点后添加一个iframe.

我遇到的问题是,当使用driver.switch_to_frame(x)切换到帧时,我仍然可以找到我的任何内容.

我已经尝试循环遍历使用driver.find_elements_by_tag_name(‘iframe’)找到的帧,并检查每个帧我期望找到的类,但没有这样的运气.

driver.switch_to_active_element()也没有给我正确的iframe.

我不确定iframe内容是否只是无法访问,因为JS DOM更改未反映在Selenium从驱动程序中看到的内容中.我已经为其他iframe完成了同样的过程而没有任何问题,但是这个只是不合作.以下是我正在处理的简化版本.

在JS之前:

<html>
    <body>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

JS之后:

<html>
    <body>
      <iframe><div>Message</div></iframe>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

Python WebDriver尝试:

driver.switch_to_frame(0)
driver.find_elements_by_class_name('modal')
driver.switch_to_default_content()

我也尝试了类似的变体:

frame = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(frame)
driver.find_elements_by_class_name('modal')

我曾尝试使用driver.execute_script来访问该对象,但获取内容超出了我的范围. Firefox控制台命令无法通过Selenium运行.

解决方法

这似乎是一个时间问题,我最终得到了以下几点:
def modal_must_show(self,string):
  for _ in range(12):
    for frame in self.driver.find_elements_by_tag_name('iframe'):
      try:
        if not frame.is_displayed():
          continue
        if frame.parent.page_source.find(string):
          return
      except:
        pass
  assert False,'Modal missing string'

javascript – 无法使用Selenium Webdriver中的send_keys上传文件

javascript – 无法使用Selenium Webdriver中的send_keys上传文件

我在使用Selenium Webdriver和 Python进行文件上传时遇到了麻烦.我昨天重新安装了selenium和python,所以我很确定一切都是最新的,如果有帮助的话我会使用Windows 7.我知道其他人已经问过这个问题,而且每个人都建议的答案是在文件上传元素上使用send_keys命令.
我已尝试在其他网页上进行文件上传,我让它至少在另一个页面上工作,但是当我尝试在页面上尝试相同的程序时,似乎没有任何事情发生.我想我记得找到其他人无法让这个工作的例子,所以我不认为我是唯一一个有这个问题的人.

可能相关的一件事是,当我在文件上传表单上尝试send_keys时,selenium抛出一个错误,说该元素不可见,因此无法与之交互(实际上,它是可见的,但显然不是在硒的眼睛里).我通过事先运行这行JavaScript修复了这个问题:

document.getElementById('UploadDocumentPopup').style.display = 'block';@H_301_13@ 
 

(UploadDocumentPopup)是文件输入部分的父元素)

另一个可能有用的消息是,当我使用Selenium 1 / Selenium RC时,我成功地使用了attach_file命令(但是仅支持Firefox).

如果它有帮助,这里是如何进入我正在使用的页面.点击此链接:https://qa.infosnap.com/family6/gosnap.aspx?action=3345&culture=en,点击“继续工作”,然后使用电子邮件aaaa@b.com和密码“asdfjkl;”(不带引号)登录.然后单击“继续工作”链接之一.您访问的页面应包含文档上传和照片上传部分.如果没有,只需使用“prev”和“next”来浏览并找到所做的页面(只有3页).这是相关的代码 – 我也尝试了很多其他的东西,如果它有用,我很乐意分享,如果我能记住它们,但这就是我认为“应该”工作的方式.如果您准备好了,请随意检查页面源,但是FYI’documentfile’是页面源中输入type =’file’元素的名称,最后一行中的xpath指向“upload” “按钮.

js = "document.getElementById('UploadDocumentPopup').style.display = 'block';"
wd.execute_script(js)
wd.find_element_by_link_text("Upload Document...").click()
wd.find_element_by_id("documentfile").send_keys("C:\\Users\\username\\testdoc.rtf")
#ActionChains(wd).send_keys(Keys.ESCAPE)
wd.find_element_by_xpath("//div[@id='modal_container']/div/form/div/input[1]").click()@H_301_13@ 
 

更新:我意识到我没有尝试过除了Firefox以外的任何东西,所以我尝试了IE11 – 发生的事情是,当调用send_keys时,本机操作系统文件上传框出现了(我觉得很奇怪,因为我没有单击“浏览”按钮 – 仅使用send_keys),并将文本输入文件名字段.然后文件上传对话消失了,但好像什么也没发生过.回顾:在Internet Explorer中,文件上传对话框打开,文件路径进入此对话框,对话框消失,但没有实际附加文件.在Firefox中,没有对话框打开,仍然没有附加文件. Chrome与Firefox相同.

编辑:这是文档上传部分的HTML代码:

<div id="UploadDocumentPopup"https://www.jb51.cc/tag/dis/" target="_blank">display:none;">
    <div>
        <h1https://www.jb51.cc/tag/ott/" target="_blank">ottom:10px; border-bottom:1px solid #CCCCCC;">
            Upload Document
        </h1>
        <p>
            Choose a file to upload.
        </p>
        <form id="documentuploadform" action="services/documentservice.aspx" enctype="multipart/form-data" method="post"
            onsubmit="return aim.submit(this,{'onStart' : startUploadDocument,'onComplete' : completeUploadDocument})">
            <input type="file" size="50" id="documentfile" name="documentfile" />
            <input type="hidden" name="cmd" value="upload" />
            <input type="hidden" id="documentuploadfield" name="field" />
            <div>
                <input name="ctl00$OutsideFormContentPlaceholder$ctl06" type="submit" value="Upload" />
                <input name="ctl00$OutsideFormContentPlaceholder$ctl07" type="button" onclick="Control.Modal.close();" value="Cancel" />
            </div>
        </form>
    </div>
</div>@H_301_13@ 
 

我还要提一下,我正在寻找一个完全基于selenium的解决方案 – 我知道AutoIt和类似的工具,但我需要远程运行它.

解决方法

我必须看到整个脚本以确保代码是正确的,但这应该给你一些工作:

wd.find_element_by_css_selector('a[onclick*="uploadDocument"]').click()
wd.find_element_by_css_selector('div#UploadDocumentPopup input#documentfile').send_keys(os.getcwd()+"/<filename>")
wd.find_element_by_css_selector('div#UploadDocumentPopup input[value="Upload"]').click()@H_301_13@ 
 

你应该在哪里替换< filename>使用您尝试上传的文件的确切名称.这个版本使用os.getcwd()来获取testscript的当前工作目录,然后将文件名附加到该工作目录的末尾,创建一个可在任何机器上工作的通用路径,而不是指定一个将中断的绝对路径下一台机器.使用此代码不再需要Javascript代码段.

我使用CSS选择器,因为我更喜欢它们而不是xpaths,如果你愿意,你应该能够轻松地转换它们. (如果你真的不能,请发表评论,我会去吧)

今天关于如何在iframe中的Rich Text编辑器中使用SendKeyswebdriver命令的介绍到此结束,谢谢您的阅读,有关from selenium.webdriver.common.keys import Keys、java – Selenium WebDriver:无法使用TinyMCE编辑器在iframe中找到元素、javascript – 如何使用Selenium WebDriver访问动态添加的iframe?、javascript – 无法使用Selenium Webdriver中的send_keys上传文件等更多相关知识的信息可以在本站进行查询。

本文标签: