Почему в моем сценарии Selenium WebDriver Python не работает input.send_keys () при запуске как www-data?

У меня есть сценарий Python, который использует Selenium WebDriver (с PyVirtualDisplay как дисплей) для входа в Flickr.

  • http://pastebin.com/dqmf4Ecw (вам нужно будет добавить свои собственные учетные данные Flickr)

Когда я запускаю его как себя на моем сервере Debian, он отлично работает. (Я sudoer, но я не использую sudo при запуске скрипта.)

Когда я запускаю его как пользовательские www-data (это то, что будет запущено, поскольку в конце концов, потому что я хочу запустить его с сайта Django), у меня возникают две проблемы: одна маленькая, одна большая:

  1. (Small): webdriver.Firefox() занимает 30-45 секунд, чтобы вернуться, по сравнению с 2 секундами при запуске как я
  2. (Большой): скрипт не может войти в Flickr. Чтобы войти в систему, я нахожу поля имени пользователя и пароля на странице входа Flickr (http://www.flickr.com/signin/) и использую element.send_keys() для ввода имени пользователя и пароля. Хотя Selenium, кажется, находит элементы (т. NoSuchElementException ), значения не вводятся в поля, когда сценарий запускается как www-data (в соответствии с снимками экрана, которые я использую с помощью browser.save_screenshot ), в отличие от сценария запускается как я.

Почему send_keys() не работает, когда скрипт запущен как www-data ? (И связано ли это с тем, что браузер запускает гораздо больше времени?)

Возможно, у вас в вашей среде что-то другое.

Попробуйте скопировать пример вашего ~/.bashrc в /home/www-data

Если этого недостаточно, запустите эту команду как в качестве текущего пользователя, так и как www-data :

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

И вставьте его (отфильтруйте свои логины / пароли) где-нибудь.

Мы увидим, что происходит.

Иногда Firefox выполняет некоторую неприятную проверку совместимости плагинов во время запуска. Поскольку каждый пользователь может иметь другой набор плагинов для браузера, это может быть причиной разницы во времени запуска. Вы можете попытаться синхронизировать свои профили Firefox между пользователями.

Тогда вы уверены, что Firefox как пользовательские www-данные имеет надлежащий доступ к сети / интернету? Можете ли вы подтвердить, что сайт Flickr правильно загружается через SeleniumHQ? « Сценарий не может войти в Flickr », слишком непроницаем. Более подробная информация о том, почему это не удается, может мгновенно выявить проблему.

Изменить: Извините, я просто понял, что не должно быть разницы в профилях, потому что Selenium создает один. Тем не менее, мой второй пункт может оказаться полезным, поэтому я не буду удалять этот ответ.

Еще несколько вещей, чтобы обдумать:

  • Не могли бы вы запустить firefox вручную из учетной записи www-data один раз и убедиться, что Firefox не обновляет себя перед каждым исполнением скрипта? Однажды я столкнулся с этой проблемой с Selenium RC в Windows и должен был завершить обновление до запуска скрипта с обновленным двоичным кодом.

  • В качестве обходного пути, я думаю, вы могли бы попробовать запустить скрипт как пользователь www-data, но подключиться удаленно к серверу webdriver, работающему в вашем логином (он же «сетчатый» режим). Будет ли это работать на вас?

Я бы предложил получить последний хром из google и попробовать вместо этого input.send_keys () в этом браузере.

Иногда некоторые функции webdriver ломаются с новыми выпусками. Если вы настроены на тестирование с помощью firefox, вам может быть повезло с более старой / новой версией selenium webdriver.

Я помню, что у меня была аналогичная проблема с send_keys () на mac. Моя проблема заключалась в том, что send_keys () не работал в некоторых модальных окнах после обновления selenium webdriver. Я исправил это, вернувшись к более раннему веб-реестру, который, как я знал, работал , Тем не менее, я использовал Ruby, а не Python для вождения webdriver.

Иногда также может возникнуть проблема с получением правильных переменных ENV в вашей оболочке, если вы используете ее как другого пользователя. Я бы предложил попробовать устранить неполадки и проверить, правильно ли установлены все переменные ENV оболочки в соответствии с www-данными.