【发布时间】:2018-06-04 17:27:57
【问题描述】:
我有一个带有 javascript 的网页,我在其中创建了一个类似这样的文本区域
var textarea = $("<textarea>");
textarea.change(() => {
console.log(textarea.val());
});
因此,当我更改 textarea 中的值然后更改焦点时,会打印该值。这在使用普通网络浏览器时可以正常工作。
但是,我有一个使用 selenium firefox 驱动程序编辑文本区域的测试。使用与上面类似的相同代码位创建两个单独的文本区域。第一个工作正常。但是对于第二个,selenium 找到 textarea,发送键和标签,但 textarea.val() 返回一个空字符串。在selenium打开的浏览器中,可以看到我发送的key确实是在textarea中输入的。
我的测试(python)中编辑文本区域的代码是
e.clear()
e.send_keys(s)
ActionChains(driver).key_down(Keys.TAB).perform()
正如我所说,我可以检查 selenium 创建的浏览器,并且已经输入了文本,并且我已将其关闭。我也知道这行得通,因为调用了更改回调。
那么为什么js脚本中的textarea.val()会返回一个空字符串呢?
更新 1
另一个奇怪的事情是,如果我在测试失败后让 selenium 创建的浏览器保持打开状态并手动更改 textarea 中的值(与刚刚产生此错误的完全相同!),它会按预期工作!这让我认为这是某种时间问题。所以我在整个测试脚本中添加了 2 秒睡眠语句,但没有帮助。
更新 2
在使用所有 sleep 语句运行测试时,我注意到第一次编辑 textarea 时,插入光标出现在 textarea 中(应该如此)。但是第二次,没有光标出现,即使文本仍然使用send_keys 正确输入。我尝试在e.clear() 之后的文本区域上添加e.click(),但光标仍然没有出现。也许缺少光标与我的问题有关。
【问题讨论】:
-
imo 这是因为您有 2 个文本区域。您正在选择
$("<textarea>"),但没有唯一标识您真正想要的那个 -
@KirilS。我认为在 jquery 中,当您像我在这里所做的那样在查询中放入有效的 html 时,jquery 会创建一个新元素而不是搜索现在的元素
-
我不是 jquery 方面的专家,所以也许它也用于创建元素,但我已经看到该语法作为选择器:w3schools.com/jquery/jquery_ref_selectors.asp
-
你可以看到一个例子here使用我用来创建元素的语法
标签: javascript python jquery selenium