Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
selenium webdriver正在清除sendKeys之前填充的字段_Selenium_Knockout.js_Webdriver - Fatal编程技术网

selenium webdriver正在清除sendKeys之前填充的字段

selenium webdriver正在清除sendKeys之前填充的字段,selenium,knockout.js,webdriver,Selenium,Knockout.js,Webdriver,我正在测试的网页正在使用knockout。在我们网站上目前没有使用淘汰的其他页面上,我没有同样的问题。我的场景是页面打开时,我在各种必填字段中输入,然后单击save按钮。在最后一个文本字段中输入值和单击“保存”按钮之间的某个时间点,以前有值的字段将被清除,因此脚本无法继续。下面是我正在运行的代码示例: driver.findElement(By.id("sku")).clear(); driver.findElement(By.id("sku")).sendKeys(itemNo); drive

我正在测试的网页正在使用knockout。在我们网站上目前没有使用淘汰的其他页面上,我没有同样的问题。我的场景是页面打开时,我在各种必填字段中输入,然后单击save按钮。在最后一个文本字段中输入值和单击“保存”按钮之间的某个时间点,以前有值的字段将被清除,因此脚本无法继续。下面是我正在运行的代码示例:

driver.findElement(By.id("sku")).clear();
driver.findElement(By.id("sku")).sendKeys(itemNo);
driver.findElement(By.id("desktopThankYouPage")).clear();
driver.findElement(By.id("desktopThankYouPage")).sendKeys(downloadUrl);
driver.findElement(By.id("mobileThankYouPage")).clear();
driver.findElement(By.id("mobileThankYouPage")).sendKeys(mobileDownloadUrl);
driver.findElement(By.id("initialPrice")).clear();
driver.findElement(By.id("initialPrice")).sendKeys(initialPrice);
driver.findElement(By.id("submitSiteChanges")).click();
正如我所说,从它在最后一个字段中输入文本到单击save(保存)之间,以前包含文本的字段会被清除,因此我的测试失败。问题是它并不总是发生。有时测试运行正常,但有时则不正常

我试过放线。睡眠(x);到处看看在某些点暂停是否能解决问题。我还尝试使用javascript在后台等待任何可能正在运行的ajax。还有driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS)的隐式等待。所有这些似乎都没有产生任何影响

我正在运行selenium server的2.13版,所有测试都在Firefox8上运行


在此方面的任何帮助都将不胜感激

我也有同样的问题。我猜你的代码在Chrome上运行良好,但在firefox上运行不好,而且当你手动操作时,它总是能正常工作

无论如何,问题很可能是Selenium的行为与真实用户不同,并且不会触发相同的事件。当您“提交”表单时,它有时不会在文本区域上执行“更改”事件,这意味着它不会更改

我在测试Backbone.modelbinding时遇到了同样的问题,它使用“change”事件从表单更新模型。Knockout也使用“change”事件,但幸运的是它也可以使用“keyup”事件。见:


无论如何,这对我来说解决了这个问题,而且一旦我做到了,就不需要睡觉了。不利的一面是,为了使测试正常工作,您运行事件的次数将超过生产中所需的次数。另一个缺点是,如果您想在值更改时运行一些代码,那么现在每个按键都会有一个事件,而不是每个字段更改都有一个事件,这有时很糟糕

还有另一种解决方案,就是让Selenium自己触发更改事件,例如:。这也是次优的,但你能做什么呢

您也可以尝试在单击按钮之前将焦点放在按钮上。我不知道这是否有效,我还没有尝试过。

Firefox有一个可防止在浏览器窗口未聚焦时执行某些事件的功能。当您运行自动化测试时,这可能是一个问题,即使窗口不在焦点上,也可能会键入自动化测试

关键是淘汰模型更新是通过
change
事件触发的(默认情况下)。如果它没有被执行,它的底层模型就不会是最新的

为了解决这个问题,我“手动”触发了更改事件,将javascript注入到我的测试中:

//suppose "element" is an input field
element.sendKeys("value");
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
jsExecutor.executeScript("$(arguments[0]).change();", element);
正如您可能已经注意到的,我正在使用jQuery触发更改事件。如果您没有在应用程序上使用jQuery,您可以检查如何使用vanilla javascript触发它


希望这对某人有所帮助。

在使用JavaScriptExecutor向文本字段发送键时,我也遇到了同样的问题

在IE中使用以下代码(同一代码用于chrome):

将代码更新为简单的“sendKeys()”方法后,解决了我的问题:

element.sendKeys("some text");

您是如何确认正在设置的值已实际设置的。单击“提交”后,KO代码中会发生什么情况?绑定到KO的dom元素是否作为模板的一部分呈现?是的,在单击submit按钮之前,我已验证字段中是否存在这些值。事实上,有时测试通过了。submit按钮获取绑定对象并将其转换为JSON,然后通过ajax将其发送到API。似乎在我们创建JSON之前,web驱动程序正在清除几个字段。我怀疑web驱动程序是否正在清除这些字段。更可能的情况是,由于时间问题或事件处理程序代码中的潜在错误,页面本身正在清除字段,但是您提到的添加睡眠似乎无法解决问题。您是否在任何字段中输入文本之前添加了很长的睡眠时间(30秒),以完全排除计时问题?你是否在每个字段输入文本之间增加了几秒钟的延迟以排除时间问题?是的,我在页面加载时长时间睡眠,然后在字段输入文本和转到下一个字段之间也有睡眠。这当然对我有帮助!FWIW,在C#中是
var-jsExecutor=(IJavaScriptExecutor)驱动程序;jsExecutor.ExecuteScript($(参数[0]).change();”,元素)
(JavascriptExecutor) driver.executeScript("arguments[0].value = '" + value + "';", element);
element.sendKeys("some text");