Robot Selenium - 在 CodeMirror 文本区域中输入文本
Robot Selenium - Enter text into CodeMirror text area
最近我开始使用 Robot 和 Selenium2Library 来自动化一些 GUI 测试用例。我正在自动化的应用程序之一是 ReviewBoard。
到目前为止,我已经能够自动执行一些操作,但在将文本输入到文本区域时遇到了很多问题。一个例子是评论板上的描述字段。
我最近的尝试是
:FOR ${URL} in @{URL_LIST}
\ Go To ${URL}
# Enter team reviewer name and press ok
\ Click Element xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/a/div[@class="rb-icon rb-icon-edit"]
\ Input Text xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/form/input rbtest_teamreviewer1
\ Press Key xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/form/input \9
\ Click Element xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/form/span/input[@class="save"]
# Fill out Testing Done field
\ Click Element xpath=//*[@id="review_request_main"]/div[2]/label/a/div[@class="rb-icon rb-icon-edit"]
\ Press Key xpath=//*[@id='review_request_main']/div[2]/div/form/*//textarea Testing Done
\ Click Element xpath=//*[@id="review_request_main"]/div[2]/div/form/div[2]/input[@class="save"]
但是,我收到异常
ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
at fxdriver.preconditions.visible (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:10092)
at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12644)
at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
at DelayedCommand.prototype.execute/< (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)
我尝试了不同的方法,例如使用输入文本而不是按键,但遇到了类似的问题...输入类型时我没有任何问题。
有人知道我如何解决这个问题吗?
如果您有兴趣,可以在 http://demo.reviewboard.org/r/1502/ 和 username:guest6317 password:demo
查看演示评论板
CodeMirror 用自己的对象替换文本区域。该对象具有与小部件交互的方法。然而,在 reviewboard 的情况下,这个对象只有在你点击文本区域时才会被初始化。因此,解决方案将如下所示:
- 找到并点击文本区域
- 找到对 CodeMirror 编辑器对象的引用
- 使用 CodeMirror 方法与编辑器小部件交互
第 1 步:单击文本区域
第一步是单击文本区域以初始化小部件。这可以使用 "Click Element" 关键字轻松完成:
click element id=field_description
第 2 步:获取对编辑器对象的引用
reviewboard 开发人员可能有该对象的引用,因此您可以向他们询问变量的名称。但是,我们可以创建自己的变量用于测试目的。 CodeMirror 在包含编辑器的 div 上添加了一个 CodeMirror
属性,因此可以使用此信息保存对临时 javascript 变量的引用:
Execute javascript
... _editor = document.querySelectorAll("div.CodeMirror")[0].CodeMirror;
第 3 步:与编辑器互动
CodeMirror 编辑器有 many methods 用于与编辑器的内容进行交互。比如你想把内容替换成你自己的字符串,可以调用setValue
方法。
例如,要用 "Hello world!" 替换所有数据,您可以这样做:
execute javascript _editor.setValue("Hello world!");
第 4 步:将它们放在一起
这是一个完整的测试脚本,它用 "Hello world" 替换了编辑器的内容,然后暂停以便您可以验证它是否有效。我在 chrome 和 firefox 的 linux 系统上测试了这个。
*** Variables ***
${ROOT} http://demo.reviewboard.org
${BROWSER} chrome
${USERNAME} guest6317
${PASSWORD} demo
*** Settings ***
Library Selenium2Library
Library Dialogs
Suite Setup open browser ${ROOT} ${BROWSER}
Suite Teardown close all browsers
*** Test Cases ***
Example
[Setup] run keywords
... Log in
... AND go to ${ROOT}/r/1502/
click element id=field_description
Execute javascript
... _editor = document.querySelectorAll("div.CodeMirror")[0].CodeMirror;
... _editor.setValue("Hello world!");
pause execution
*** Keywords ***
Log in
go to ${ROOT}/account/login
input text id=id_username ${USERNAME}
input text id=id_password ${PASSWORD}
submit form
最近我开始使用 Robot 和 Selenium2Library 来自动化一些 GUI 测试用例。我正在自动化的应用程序之一是 ReviewBoard。
到目前为止,我已经能够自动执行一些操作,但在将文本输入到文本区域时遇到了很多问题。一个例子是评论板上的描述字段。
我最近的尝试是
:FOR ${URL} in @{URL_LIST}
\ Go To ${URL}
# Enter team reviewer name and press ok
\ Click Element xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/a/div[@class="rb-icon rb-icon-edit"]
\ Input Text xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/form/input rbtest_teamreviewer1
\ Press Key xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/form/input \9
\ Click Element xpath=//*[@id="fieldset_reviewers_body"]/tr[2]/td/form/span/input[@class="save"]
# Fill out Testing Done field
\ Click Element xpath=//*[@id="review_request_main"]/div[2]/label/a/div[@class="rb-icon rb-icon-edit"]
\ Press Key xpath=//*[@id='review_request_main']/div[2]/div/form/*//textarea Testing Done
\ Click Element xpath=//*[@id="review_request_main"]/div[2]/div/form/div[2]/input[@class="save"]
但是,我收到异常
ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
at fxdriver.preconditions.visible (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:10092)
at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12644)
at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
at DelayedCommand.prototype.execute/< (file:///tmp/tmpW24ACY/webdriver-py-profilecopy/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)
我尝试了不同的方法,例如使用输入文本而不是按键,但遇到了类似的问题...输入类型时我没有任何问题。
有人知道我如何解决这个问题吗?
如果您有兴趣,可以在 http://demo.reviewboard.org/r/1502/ 和 username:guest6317 password:demo
查看演示评论板CodeMirror 用自己的对象替换文本区域。该对象具有与小部件交互的方法。然而,在 reviewboard 的情况下,这个对象只有在你点击文本区域时才会被初始化。因此,解决方案将如下所示:
- 找到并点击文本区域
- 找到对 CodeMirror 编辑器对象的引用
- 使用 CodeMirror 方法与编辑器小部件交互
第 1 步:单击文本区域
第一步是单击文本区域以初始化小部件。这可以使用 "Click Element" 关键字轻松完成:
click element id=field_description
第 2 步:获取对编辑器对象的引用
reviewboard 开发人员可能有该对象的引用,因此您可以向他们询问变量的名称。但是,我们可以创建自己的变量用于测试目的。 CodeMirror 在包含编辑器的 div 上添加了一个 CodeMirror
属性,因此可以使用此信息保存对临时 javascript 变量的引用:
Execute javascript
... _editor = document.querySelectorAll("div.CodeMirror")[0].CodeMirror;
第 3 步:与编辑器互动
CodeMirror 编辑器有 many methods 用于与编辑器的内容进行交互。比如你想把内容替换成你自己的字符串,可以调用setValue
方法。
例如,要用 "Hello world!" 替换所有数据,您可以这样做:
execute javascript _editor.setValue("Hello world!");
第 4 步:将它们放在一起
这是一个完整的测试脚本,它用 "Hello world" 替换了编辑器的内容,然后暂停以便您可以验证它是否有效。我在 chrome 和 firefox 的 linux 系统上测试了这个。
*** Variables ***
${ROOT} http://demo.reviewboard.org
${BROWSER} chrome
${USERNAME} guest6317
${PASSWORD} demo
*** Settings ***
Library Selenium2Library
Library Dialogs
Suite Setup open browser ${ROOT} ${BROWSER}
Suite Teardown close all browsers
*** Test Cases ***
Example
[Setup] run keywords
... Log in
... AND go to ${ROOT}/r/1502/
click element id=field_description
Execute javascript
... _editor = document.querySelectorAll("div.CodeMirror")[0].CodeMirror;
... _editor.setValue("Hello world!");
pause execution
*** Keywords ***
Log in
go to ${ROOT}/account/login
input text id=id_username ${USERNAME}
input text id=id_password ${PASSWORD}
submit form