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

时间:2016-04-23 00:42:07

标签: selenium robotframework codemirror review-board

最近我开始使用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/查看演示评论板,用户名:guest6317密码:demo

1 个答案:

答案 0 :(得分:2)

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

  1. 找到并点击textarea
  2. 找到对CodeMirror编辑器对象的引用
  3. 使用CodeMirror方法与编辑器小部件进行交互
  4. 第1步:点击文字区

    第一步是单击textarea以初始化小部件。使用“Click Element”关键字可以轻松完成此操作:

    click element    id=field_description    
    

    第2步:获取对编辑器对象的引用

    审核板开发人员可能会引用该对象,因此您可以向他们询问变量的名称。但是,我们可以创建自己的变量用于测试目的。 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