4

我有一个 Python 脚本,它使用Selenium WebDriver(以PyVirtualDisplay作为显示器)登录 Flickr。

当我在我的 Debian 服务器上以自己的身份运行它时,它运行良好。(我是 sudoer,但我在运行脚本时不使用 sudo。)

当我以用户身份运行它时www-data(最终它将运行它,因为我想从 Django 网站触发它),我遇到了两个问题,一个小,一个大:

  1. (小):webdriver.Firefox()调用需要 30-45 秒才能返回,而我自己运行时需要 2 秒
  2. (大):脚本无法登录 Flickr。为了登录,我在 Flickr 登录页面 (http://www.flickr.com/signin/) 上找到了用户名和密码字段,并使用它element.send_keys()来输入用户名和密码。尽管 Selenium 似乎找到了元素(即没有抛出),但是当脚本运行时(根据我使用的屏幕截图NoSuchElementException),值不会输入到字段中,这与脚本作为我自己运行时不同。www-databrowser.save_screenshot

为什么send_keys()当脚本运行时不起作用www-data?(这是否与浏览器启动时间更长有关?)

4

4 回答 4

2

也许你的环境中有一些不同的东西。

尝试通过示例复制您~/.bashrc/home/www-data

如果还不够,请以您当前用户的身份运行此命令并以以下身份运行www-data

strace -tt -f -s 1000 -o /tmp/trace ./script.py

并将其粘贴(过滤掉您的登录名/密码)某处。

我们会看看会发生什么。

于 2012-10-07T12:07:19.417 回答
1

还有一些需要思考的事情:

  • 您能否从 www-data 帐户手动生成一次 firefox,并确保 Firefox 在每次执行脚本之前都不会自我更新?我曾经在 Windows 上使用 Selenium RC 遇到过这个问题,并且必须在使用更新的二进制文件启动脚本之前让更新完成。

  • 作为一种解决方法,我想您可以尝试以 www-data 用户身份运行脚本,但远程连接到在您的登录名中运行的 webdriver 服务器(也称为“网格”模式)。这对你有用吗?

于 2012-10-10T09:01:03.227 回答
1

有时,Firefox 在启动期间会执行一些令人讨厌的插件兼容性检查。由于每个用户可以有一组不同的浏览器插件,这可能是启动时间不同的原因。您可以尝试在用户之间同步您的 Firefox 配置文件。

那么,您确定 Firefox 作为用户 www-data 具有正确的网络/互联网访问权限吗?您能否确认 Flickr 站点通过 SeleniumHQ 正确加载?“脚本无法登录 Flickr ”太不精确了。关于失败原因的更多细节可能会立即揭示问题。

编辑:对不起,我只是明白配置文件不应该有差异,因为 Selenium 创建了一个。不过,我的第二点可能有用,所以我不会删除这个答案。

于 2012-10-08T20:18:46.257 回答
0

我建议从 google 获取最新的 chrome,然后在该浏览器中尝试 input.send_keys()。

有时 webdriver 的某些功能会在新版本中被破坏。如果您一心想用 Firefox 进行测试,那么使用旧/新版本的 selenium webdriver 可能会更好。

我记得在 mac 上遇到过关于 send_keys() 的类似问题。我的问题是,在我更新 selenium webdriver 后,send_keys() 在某些模式窗口中不起作用。我通过恢复到我知道可以工作的旧 webdriver 来修复它. 但是,我使用 Ruby 而不是 Python 来驱动 webdriver。

有时,如果您将其用作其他用户,则在您的 shell 中获取正确的 ENV 变量也可能会出现问题。我建议尝试进行故障排除,看看是否所有 shell ENV 变量都在 www-data 下正确设置。

于 2012-10-12T06:32:10.343 回答