【发布时间】:2020-03-06 14:16:26
【问题描述】:
我是自动化测试方面的初学者(如果我的尝试不好,请原谅我,我尝试 google 并经历了一堆对我来说似乎有意义的事情),我有一个项目一个反应/redux 前端。我正在使用 webdriver.io 进行自动化,因为其他解决方案(例如 testcafe 或 cypress)不适用于我们的授权流程。
前端很乱,它还没有 ID,并且类对于多个事物具有相同的名称,但我为此创建了一个功能请求。
与此同时,我想做的是将值发送到 3 个不同的字段。 以下是 Chrome 元素选项卡中的元素:
<div class="user-settings">
<div class="table">
<div class="row">
<div class="cell">
<label class="textfield-with-label textfield-with-label--full-width"><span class="textfield-label">Phone</span>
<input type="text" class="textfield textfield--valid-value textfield--raised textfield--full-width" value="">
</label>
</div>
</div>
<div class="row">
<div class="cell">
<label class="textfield-with-label textfield-with-label--full-width"><span class="textfield-label">Agent identifier</span>
<input type="text" class="textfield textfield--valid-value textfield--raised textfield--full-width" value="">
</label>
</div>
</div>
<div class="row">
<div class="cell">
<label class="textfield-with-label textfield-with-label--full-width"><span class="textfield-label">Password</span>
<input type="password" class="textfield textfield--valid-value textfield--raised textfield--full-width" value="">
</label>
</div>
</div>
<div class="row">
<div class="cell">
<label class="checkboxfield-with-label"><span class="checkboxfield-label">Receive voice calls</span>
<input type="checkbox" class="checkboxfield">
</label>
</div>
</div>
<div class="row">
<div class="update-action">
<div class="update-button">
<button type="text" class="action-button action-button--icon action-button--text action-button--settings action-button--tick" title="Update"><i class="icon-wrapper icon-tick" aria-hidden="true"><svg focusable="false" role="img" viewBox="0 0 48 48"><use xlink:href="#icon-tick"></use></svg></i><span class="action-button__text">Update</span></button>
</div>
</div>
</div>
</div>
我想发送“电话”、“代理标识符”、“密码”的值,但我可能也会在此选项卡上的其他元素(接收语音和更新按钮)上遇到困难。
如果我尝试:
const Extension = $('input.textfield textfield--valid-value.textfield--raised.textfield--full-width');
Extension.setValue('value');
这可行,但仅适用于第一个字段,可能是因为它是第一个元素。对于第二个和第三个它不起作用,如何实现相同的事情,但对于所有 3 个元素?
我也尝试了前两个元素,因为我认为它可以工作:
const AgentID = $("span.textfield-label='Agent identifier'");
AgentID.setValue('value2');
但这对我来说没有多大意义,也不起作用。我很难理解这些选择器,没有 ID 或有些独特的类名肯定无济于事。
【问题讨论】:
-
仅供参考,类名意味着可以重复使用多次。事实上,如果一个类名在应用程序中是唯一的,那就是一个危险信号。应为此目的使用 ID。在添加 ID 之前启动自动化可能为时过早?
-
我同意现在还为时过早,但有人要求我开始做。我在这个 sprint 中大约有 1 周的时间无事可做。这可能是一次很好的(而且看起来很痛苦)的学习经历。
-
我的意思是,你可以使用类似
$("span.textfield-label").filter(el => el.textContent == 'Agent identifier');我猜? -
这不起作用,''(...).filter is not a function"。这可能是一个误导性错误,问题是它找不到那个选择器,我'在之前的测试中看到过,它有几乎相同的类,唯一的区别是它们有一个标题,所以我使用 longclassname[title='class title'] 并且它有效。但我做不到因为这些类没有标题。
-
显然 webdriver 不是 jQuery :)。抱歉,我被
$()语法误导了。
标签: javascript css automation webdriver-io