Selenium+firefox:空 execute_script 个参数

Selenium+firefox: empty execute_script arguments

我正在尝试使用 javascript 而不是 send_keys() 方法来设置 textarea 值。

如文档所述,我应该能够将 webelement 作为参数传递给 execute_script,并通过 arguments 数组引用此参数。但是,我已经在 firefox js 控制台中检查过,arguments 是对象,我把什么作为 execute_script 参数并不重要 - arguments 始终是一个空对象。

>>>> web = webdriver.Firefox()
>>>> web.get("http://somepage.com")
>>>> element = web.find_element_by_tag_name("textarea")
>>>> web.execute_script("return typeof(arguments)", element)
u'object'
>>> web.execute_script("return arguments",element)
[]

有人有类似主题的经验吗?如何将 webElement 作为 javascript 的参数?

使用 Firefox 35.0,selenium 2.44.0。

这是相关的错误:Firefox 35: Passing arguments to executeScript isn't working

在今天发布的selenium 2.45中修复,升级selenium包:

pip install --upgrade selenium

旧答案:

我能够使用 selenium==2.44.0Firefox 35.0 重现该问题:

>>> element = web.find_element_by_tag_name('textarea')
>>> web.execute_script("return arguments",element)
[]

降级到 Firefox 34.0.5 解决了问题:

>>> element = web.find_element_by_tag_name('textarea')
[<selenium.webdriver.remote.webelement.WebElement object at 0x1022d1bd0>]

从版本 35 开始,Selenium 无法再在 Firefox 中使用传递的参数执行 javascript。Selenium 已经能够通过一种称为 __exposedProps__ 的后门传递参数。作为外部绑定接口整体收紧的一部分(以及一些繁忙的工作,由他们从 Google 赚到的所有钱资助),他们弃用并删除了这个接口。他们的意图记录在 deprecation notice in mid-2014. Selenium bug #8390 covers it, but I take it this caught the dev team by surprise and I don't see any activity to migrate to another interface yet, which I presume will be WebIDL.

它不会影响其他浏览器,但 Firefox 是迄今为止使用 Selenium 进行测试的最快、最简单的方法。目前,对我们的网络测试人员来说,最好的选择是降级到 Firefox 34 并关闭自动更新,直到有解决方案可用。