【发布时间】:2018-08-22 02:44:51
【问题描述】:
我正在使用 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。
【问题讨论】:
-
在链接的示例页面上,
//input返回六个匹配项,//input[@ng-model='user.firstName']匹配第一个名称输入元素。 -
@BillHileman 您能否与我分享您正在使用的库版本?也许我有一些版本问题。
-
我只使用 Chrome 开发者工具,抱歉。我只是验证 xpath 访问,仅此而已。
-
这是正确的,当我在 web 控制台中使用 //input xpath 解析页面源代码时,它显示了 6 个元素,但使用 ExtendedSelenium2Library 它不匹配任何元素。
-
那么我认为您走在正确的道路上,因为它几乎必须是硒库问题。我不使用 angular 或 python,所以恐怕我不能再提供帮助了。
标签: angular selenium robotframework