Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么WebdriverIO制作POST';元素';请求从未使用过的webelement?_Javascript_Selenium_Selenium Webdriver_Webdriver Io - Fatal编程技术网

Javascript 为什么WebdriverIO制作POST';元素';请求从未使用过的webelement?

Javascript 为什么WebdriverIO制作POST';元素';请求从未使用过的webelement?,javascript,selenium,selenium-webdriver,webdriver-io,Javascript,Selenium,Selenium Webdriver,Webdriver Io,我在玩webdriverIO,它看起来很不错!我已经喜欢这个框架的很多特性了 我正在调查WebdriverIO如何使用此测试处理不存在的元素和惰性元素加载: it('no element, and not used', () => { browser.pause(5000) let non_exist = browser.$('.nonexist') }); 转轮输出: ``` [17:23:25] COMMAND POST "/wd/hub/sessio

我在玩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"}
```
```
[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              []
```
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:23:25]  COMMAND    POST     "/wd/hub/session/6b79fd07-5f5d-42ce-b1e5-f99734aae128/element"
[17:23:25]  DATA                {"using":"css selector","value":".nonexist"}
```
```
[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服务器日志:

```
*** 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个请求-首先是声明,然后是尝试对此元素应用某些操作时的“元素”请求


所以问题是,为什么WebDrivero在我的示例中两次尝试查找元素?并没有抛出异常,一切都很好,但我只是想知道这是一个bug还是设计造成的?

这是设计造成的。即使声明如果没有找到元素,驱动程序应该抛出异常,WebdriverIO也没有。这背后的原因是,在WebDrivero中,您可以对不存在的元素调用操作。这是出于语法原因。它允许在变量中定义元素,然后在以后使用它,如:

var myElem = $('#notExisting')
myElem.waitForExist() // waits for element to exist
console.log(myElem.getText()) // returns text if elem shows up
但是,如果您想在元素不存在时调用该元素上的操作,那么WebDrivero足够聪明,可以失败,如您所述:

var myElem = $('#notExisting')
console.log(myElem.getText()) // THROWS EXCEPTION

这种设计的一个缺点是,对不存在的元素的查询要比对存在的元素的查询花费多一点时间,但从长远来看是可以忽略的。显然,它的优点是更好、更容易阅读测试代码,从而节省了更多的时间。

谢谢您的回答!我理解惰性元素不应该在声明上抛出异常,这是一个非常好的方法(我认为)。但我现在想知道为什么我们甚至需要在声明时发送POST请求(请参阅有问题的第一个测试),因为我们不知道是否有元素同时出现。它基本上会重新获取itAlso,以防元素首先存在,我们重用从驱动程序获得的引用,这样我们就不必再次获取元素