Robot Selenium - 在 CodeMirror 文本区域中输入文本

Posted

技术标签:

【中文标题】Robot Selenium - 在 CodeMirror 文本区域中输入文本【英文标题】:Robot Selenium - Enter text into CodeMirror text area 【发布时间】:2016-08-16 18:17:03 【问题描述】:

最近我开始使用带有 Selenium2Library 的 Robot 来自动化一些 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/查看demo reviewboard,用户名:guest6317 密码:demo

【问题讨论】:

嗨@Kevin Yu - 请您提供您在这里编写的完整代码吗? 单击rb-icon-edit 后,页面会生成一个新的 CodeMirror 编辑器实例。此处描述了更改其值的正确方法:***.com/questions/8378678。但是您需要知道 CodeMirror 对象的名称。我建议你向开发人员询问这个问题。当您知道对象名称时,使用 RobotFramework 的 Execute javascript 而不是 Press Key 运行 javascript @Curious 我已经用完整的代码更新了它。谢谢。 不过,这些代码是完整的。您使用哪种语言编写了这段代码?在上述问题中复制并粘贴您的代码。您可以使用代码中的测试数据更新敏感数据,但提供您编写的清晰代码。 【参考方案1】:

CodeMirror 将 textarea 替换为它自己的对象。该对象具有与小部件交互的方法。但是,在审查板的情况下,该对象在您单击文本区域之前不会被初始化。因此,解决方案将如下所示:

    找到并点击文本区域 找到对 CodeMirror 编辑器对象的引用 使用 CodeMirror 方法与编辑器小部件进行交互

第一步:点击文本区域

第一步是单击文本区域以初始化小部件。这可以通过“点击元素”关键字轻松完成:

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

【讨论】:

将此标记为已接受的答案,因为它全面且准确。最终我在看到你的答案之前所做的是: Execute Javascript document.getElementsByClassName("CodeMirror")[0].CodeMirror.setValue("hello world"); 我尽我所能使用输入文本功能,但无论我定位到哪里,它都不起作用。 Javascript 解决方案工作得很好。谢谢!

以上是关于Robot Selenium - 在 CodeMirror 文本区域中输入文本的主要内容,如果未能解决你的问题,请参考以下文章

Robot Framwork +Selenium2环境搭建

Robot Selenium - 在 CodeMirror 文本区域中输入文本

Robot Test Framework + Selenium 的几个坑

python+selenium+Robot

[Selenium+Java] https://www.guru99.com/using-robot-api-selenium.html

使用 Selenium 和 Robot Framework 遍历 Web 元素