我正在使用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。
答案 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服务也是如此;)
感谢所有尝试过帮助的人!