无法更改输入字段中的文本 - 找不到输入元素,但它存在

时间:2018-03-13 18:08:49

标签: angular selenium robotframework

我正在使用Selenium测试Web服务。页面上的某些元素由Angular修改。我正在尝试更改输入字段中的文字,但是当我检查源代码时,它不是input而是span元素是不可编辑的。

例如,在https://www.w3schools.com/angular/tryit.asp?filename=try_ng_form(不是我正在测试的页面,但显示完全相同的问题),我们有一些输入元素:

<form novalidate="" class="ng-pristine ng-valid">
    First Name:<br>
    <input type="text" ng-model="user.firstName" class="ng-pristine ng-valid ng-not-empty ng-touched"><br>
    Last Name:<br>
    <input type="text" ng-model="user.lastName" class="ng-pristine ng-untouched ng-valid ng-not-empty">
    <br><br>
    <button ng-click="reset()">RESET</button>
</form>

为这样的元素编写xpath并不是很难,但令我惊讶的是Selenium在页面上找不到任何inputs

ValueError: Element locator 'xpath=//input' did not match any elements.

所以我使用了来自ExtendedSelenium2Library的Log Source关键字来验证它,并且在已记录的源代码中,我感兴趣的input元素看起来像这样:

<span class="cm-m-xml cm-tag">input</span>

所以这实际上是span

首先我认为Angular与此行为有一些共同点,我试图通过一些特定的Angular定位器来定位元素,如:

input text  model=user.firstName  Hello!

并且它总是以

结束
ValueError: Element locator 'model=user.firstName' did not match any elements

所以我为span元素编写了xpath。它被发现但终于结束了:

InvalidElementStateException: Message: invalid element state: Element must be user-editable in order to clear it.

我的上一个代码看起来像这样(这只是测试代码):

*** Settings ***
#Library         Selenium2Library
#Library         AngularJSLibrary
Library          ExtendedSelenium2Library
Test Setup  open browser  url=${url}  browser=chrome
Test Teardown  close browser


*** Variables ***
${url}  https://www.w3schools.com/angular/tryit.asp?filename=try_ng_form


*** Test Cases ***
Will change it?
  #  Go to  ${url}
  #  Wait for angular
  #  input text  model=user.firstName  Hello!
     Log Source
     input text  xpath=//span[@class="cm-m-javascript cm-string" and text()='"John"']  Hello!

我尝试了Selenium2Library,AngularJSLibrary,ExtendedSelenium2Library和许多xpath表达式,但没有成功。

简短问题:基于此example page, 如何使用Robot Framework Selenium更改名字输入字段的值?

pip freeze的一部分:

robotframework==3.0.2
robotframework-angularjs==0.0.6
robotframework-extendedselenium2library==0.9.1
robotframework-selenium2library==1.8.0

我正在使用Python 2.7.13。

1 个答案:

答案 0 :(得分:0)

感谢@Ian评论和我的经理在工作中的帮助,我终于解决了这个问题。

首先我不知道iframe是如此特别。如果有人想要阅读有关他们的内容here是好文章。

所以我尝试使用Select Frame关键字选择合适的框架,但是我遇到了在chrome中选择它的问题,最后是

NoSuchFrameException: Message: no such frame: element is not a frame

但我发现我使用的chrome有一些issues具有适当的帧检测功能。

所以我尝试使用FF以下结果:对于FF版本58,我在浏览器打开期间遇到超时异常

Setup failed:
WebDriverException: Message: timeouts

因此我将其降级为FF版本55并在Select Frame call

时出错
NoSuchFrameException: Message: Unable to locate frame

所以我再次将它降级到版本53并且在发送密钥方面遇到了问题:

WebDriverException: Message: Expected [object Undefined] undefined

link来描述。最后将其降级到版本52,下面的代码开始工作:

*** Settings ***
Library          SeleniumLibrary
Test Setup  open browser  ${url}
Test Teardown  close browser


*** Variables ***
${url}  https://www.w3schools.com/angular/tryit.asp?filename=try_ng_form


*** Test Cases ***
Will change it?
    Log Source  # for debug
    Select frame  iframeResult  
    Log Source  # for debug
    Input Text   xpath=//input  Hello!

我发现Selenium2Library我正在使用遗产并将其更改为SeleniumLibrary

这是我最终的库版本:

robotframework==3.0.2
robotframework-angularjs==0.0.6
robotframework-extendedselenium2library==0.9.1
robotframework-selenium2library==1.8.0
robotframework-seleniumlibrary==3.1.1

最后我将我的chrome升级到版本64.0.3282.186(我应该从那开始)并且上面提供的代码完美无缺。对于目标Web服务也是如此;)

感谢所有尝试过帮助的人!