![](/img/trans.png)
[英]Why send_keys function doesn't work in Python Selenium?
[英]Why doesn’t input.send_keys() work in my Selenium WebDriver Python script when run as www-data?
我有一个Python脚本,它使用Selenium WebDriver (以PyVirtualDisplay作为显示)登录Flickr。
当我在Debian服务器上以自己的身份运行它时,它运行正常。 (我是一个sudoer,但我在运行脚本时不使用sudo。)
当我以用户www-data
运行它时(最终它会运行它,因为我想从Django网站触发它),我遇到两个问题,一个很小,一个很大:
webdriver.Firefox()
调用返回需要30-45秒,相比之下我自己运行2秒 element.send_keys()
输入用户名和密码。 虽然Selenium似乎找到了元素(即没有抛出NoSuchElementException
),但是当脚本作为www-data
运行时,不会在字段中输入值(根据我使用browser.save_screenshot
截取的屏幕截图),这与脚本不同像我一样奔跑。 当脚本作为www-data
运行时,为什么send_keys()
不起作用? (它与浏览器开始需要更长的时间有关吗?)
也许你的环境有不同的东西。
尝试通过示例复制/home/www-data
~/.bashrc
如果还不够,请将此命令作为当前用户和www-data
:
strace -tt -f -s 1000 -o /tmp/trace ./script.py
并在某处粘贴它(过滤掉您的登录名/密码)。
我们将看到发生了什么。
有时,Firefox会在启动时执行一些讨厌的插件兼容性检查。 由于每个用户都可以拥有一组不同的浏览器插件,因此可能会导致启动时间不同。 您可以尝试在用户之间同步Firefox配置文件。
那么,你确定Firefox作为用户www-data有适当的网络/互联网访问? 你能确认通过SeleniumHQ正确加载Flickr网站吗? “ 脚本无法登录Flickr ”太不准确了。 关于失败原因的更多细节可能会立即揭示问题。
编辑:对不起,我只是明白配置文件应该没有区别,因为Selenium会创建一个。 不过,我的第二点可能有用,所以我不会删除这个答案。
还有一些值得思考的事情:
你可以从www-data账户手动生成一次firefox并确保Firefox在每次执行脚本之前都没有更新自己吗? 我曾经在Windows上使用Selenium RC遇到这个问题,并且必须在使用更新的二进制文件启动脚本之前完成更新。
作为一种解决方法,我想您可以尝试将脚本作为www-data用户运行,但远程连接到在登录中运行的webdriver服务器(也称为“网格”模式)。 这对你有用吗?
我建议从谷歌获取最新的chrome并在该浏览器中尝试输入input.send_keys()。
有时webdriver的某些功能会被新版本破坏。如果你一直想用firefox进行测试,那么你可能会更好地使用旧版/更新版本的selenium webdriver。
我记得在mac上有一个关于send_keys()的类似问题。我的问题是在我更新了selenium webdriver后,send_keys()在某些模态窗口中无效..我通过恢复到我知道工作的旧webdriver来修复它。 但是,我使用Ruby而不是Python来驱动webdriver。
有时,如果您将shell用作其他用户,则在shell中获取正确的ENV变量可能也存在问题。 我建议尝试进行故障排除,看看是否在www-data下正确设置了所有shell ENV变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.