我正在玩webdriverIO,看起来很不错!我已经喜欢这个框架的很多功能了。
我正在调查WebdriverIO如何使用不存在的元素和延迟元素加载进行此测试:
it('no element, and not used', () => {
browser.pause(5000)
let non_exist = browser.$('.nonexist')
});
亚军输出:
```
[17:23:25] COMMAND POST "/wd/hub/session/6b79fd07-5f5d-42ce-b1e5-f99734aae128/element"
[17:23:25] DATA {"using":"css selector","value":".nonexist"}
```
webdriver服务器日志:
```
*** Element info: {Using=css selector, value=.nonexist}
17:23:25.840 INFO - Executing: [delete session: 6b79fd07-5f5d-42ce-b1e5-f99734aae128])
```
因为我看到WebdriverIO仍然向selenium服务器发送POST请求,并试图在声明中找到元素。
现在让我们看看第二次测试。这里我声明了元素,它在页面上不存在,但是稍后尝试使用它:
it('no element, used later in the code', () => {
browser.pause(5000)
let myElem = browser.$('.nonexist')
console.log('AND NOW FAIL!')
console.log(myElem.getText())
});
测试跑步者输出:
```
[17:30:35] COMMAND POST "/wd/hub/session/05e4115c-ed66-4e47-8a01-c37208d379ab/element"
[17:30:35] DATA {"using":"css selector","value":".nonexist"}
AND NOW FAIL!
[17:30:36] COMMAND POST "/wd/hub/session/05e4115c-ed66-4e47-8a01-c37208d379ab/elements"
[17:30:36] DATA {"using":"css selector","value":".nonexist"}
[17:30:36] RESULT []
```
Selenium Server日志:
```
*** Element info: {Using=css selector, value=.nonexist}
17:30:36.133 INFO - Executing: [find elements: By.cssSelector: .nonexist])
17:30:36.155 INFO - Done: [find elements: By.cssSelector: .nonexist]
```
Webdriver IO发送2个请求 - 首先是声明,然后是'elements'请求尝试对此元素应用某些操作。
所以问题是,为什么WebdriverIO试图在我的例子中找到两次元素?没有抛出异常,一切都很好,但我只是想知道这是一个错误还是设计?
答案 0 :(得分:2)
这是设计的。即使Webdriver Spec声明如果找不到元素,驱动程序也应抛出异常,而WebdriverIO则不会。这背后的原因是在WebdriverIO中,您可以对不存在的元素调用操作。这是出于语法原因。它允许在变量中定义元素,然后在以下时间使用它:
var myElem = $('#notExisting')
myElem.waitForExist() // waits for element to exist
console.log(myElem.getText()) // returns text if elem shows up
然而,如果你想在元素上调用一个动作,如果你不像上面提到的那样存在,那么WebdriverIO就足够智能了。
var myElem = $('#notExisting')
console.log(myElem.getText()) // THROWS EXCEPTION
这种设计的一个缺点是对非现有元素的查询比存在的元素花费更多的时间,但从长远来看是可忽略的。显然,优势是更好,更容易阅读测试代码,节省了更多的时间。