如何在水豚中即时设置/send_keys文本区域



我需要立即用很长的string填充textarea以进行测试。

set/send_keys模拟键入,对于Sauce Labs来说太慢,导致超时。

有没有办法立即填满textareaCapybara

立即执行此操作的唯一方法是使用execute_script通过 JS 设置值

element = find('textarea') # however you locate the element
execute_script('arguments[0].value = arguments[1]', element, text_to_set)

注意:这不会触发用户在输入文本区域时生成的所有事件

TL;DR:使用 Javascript/JQuery(.val()函数)通过.execute_script()/.evaluate_script()函数设置字段的value。它将自动发送完整的字符串。您有更多细节在下面。

例:

def execute_script(script)
browser.execute(function() { 
$('<yourSelectorHere>').val("blablabla"); 
})
nil
end

Selenium团队决定采用一种LOOOONG的方式来使其以这种方式工作,因为它实际上将模拟用户填充该input/textarea/field/等的真实方式。

注意:我在WebdriverIO中编写了该命令,但现在也已更新为Capybara


实际上,使用.setValue()/.set().keys()/.send_keys()方法将以字符数组的形式对目标元素(大概是<input>)发出POST操作。请参阅示例:

命令:browser.setValue('input[connectqa-input="rename-device"]','stackoverflowstackoverflowstack');

输出:

> browser.setValue('input[connectqa-input="rename-device"]','stackoverflowstackoverflowstack')
{ state: 'pending' }
> [21:52:25]  COMMAND   POST     "/wd/hub/session/3d830ffd-21c6-4e5f-a6b3-4f8a03821991/elements"
[21:52:25]  DATA                {"using":"css selector","value":"input[connectqa-input="rename-device"]"}
[21:52:25]  RESULT              [{"ELEMENT":"6"}]
[21:52:25]  COMMAND     POST     "/wd/hub/session/3d830ffd-21c6-4e5f-a6b3-4f8a03821991/element/6/clear"
[21:52:25]  DATA                {}
[21:52:25]  COMMAND     POST     "/wd/hub/session/3d830ffd-21c6-4e5f-a6b3-4f8a03821991/element/6/value"
[21:52:25]  DATA                {"value":["s","t","a","c","k","o","v","e","r","f","(21 more items)"],"text":"stackoverflowstackoverflowstack"}

逃避这种情况的一种快速简便的方法是继续通过.execute()/.executeScript()方法滥用.val()JQuery 函数:

命令:browser.execute(function() { $('input[connectqa-input="rename-device"]').val("dwadawdawdawdawdawdwadawawdadawdawdaw"); })(WebdriverIO)

有关Capybara语法,请参阅此问题。它涵盖了.execute_script().evaluate_script()。(我不想贬低他们的观点)。此外,您还应该在此处事先记录这些方法。

输出:

> [21:59:38]  COMMAND   POST     "/wd/hub/session/3d830ffd-21c6-4e5f-a6b3-4f8a03821991/execute"
[21:59:38]  DATA                {"script":"return (function () { $('input[connectqa-input="rename-device"]').val("dwadawdawdawdawdawdwadawawdadawdawdaw"); }).apply(null, arguments)","args":[]}

希望它有帮助!

最新更新