Как передать комбинацию клавиш окну браузера? MAC+FF

Небольшая предыстория.
Делаю первые шаги в автоматизации тестирования на Python+Selenium. В тесте используется remote webdriver. На удалённой машине (Mac) он запускает Firefox, делает необходимые действия, и затем driver.quit() . Через сутки тест падает. Выяснили что происходит утечка памяти в Firefox. Как сообщил админ Mac’a: у Маков есть особенность - после закрытия окна процесс всё равно висит в памяти. Гугл подсказал что утечка памяти в Firefox на маках очень распространённая тема. Админ подсказал что для полного завершения процесса необходимо закрывать приложение комбинацией Command+Q.

Вопрос:
Можно ли передавать сочетание клавиш через send_keys окну браузера?

PS Пока нагуглил только как передавать сочетания клавиш элементу веб страницы, но не окну браузера.

PPS Пробовал решить проблему путём использования Chrome вместо Firefox - появились другие проблемы с chromedriver. Но это уже другая тема :smile:

  1. Зачем гонять тесты на Mac, если это не тесты Safari?
    1.1. Ну, т. е. я гоняю, конечно, на Mac все свои тесты, но только во время их написания, потом они уходят на linux машину, где крутяться внутри xvfb.
  2. Оторвите админу голову, чтобы глупости не говорил.
  3. «у Маков есть особенность - после закрытия окна процесс всё равно висит в памяти» — совершенный бред.

Нет процесса firefox

$ ps ax | grep firefox
32757 s001  S+     0:00.01 grep firefox

Запускаем WebDriver

>>> from selenium import webdriver
>>> driver = webdriver.Firefox()

Процесс firefox появился

$ ps ax | grep firefox
32808 s001  S+     0:01.64 /Applications/Firefox.app/Contents/MacOS/firefox-bin -foreground
32810 s002  R+     0:00.00 grep firefox

Закрываем WebDriver

>>> driver.quit()

Процесса firefox нет

$ ps ax | grep firefox
32819 s002  R+     0:00.00 grep firefox

Единственный случай, когда процесс может падать, это если тест упал и дело не долшло до driver.quit(). Для этого существуют исключения, а ещё лучше системы тестирования.
Я не знаю, какие есть на Python, но по аналогии для Ruby — это rspec. Так вот, в этих тестах есть понятие выполнения операций до теста и после теста, вне зависимости от его результатов.

# encoding: utf-8

require 'selenium-webdriver' 

describe 'foo' do
  before :all do
    driver = Selenium::WebDriver.for :firefox
  end
  after :all do
    driver.quit
  end
  it 'bar' do
    # test case code
  end
end

В примере выше сам тест находится внутри блока it. И как бы тест не завершился всегда сработают hooks before и after.
Добрый доктор @polusok подскажет хороший модуль для юнит-тестирования на Python.

В сааааааааааааааааааааааааааааааааааааамом, точнее в САААААААААААМОМ крайнем случае можно в случае падения теста заходить по ssh на удалённую машину и убивать процесс $ killall -9 firefox-bin. Но помните, я вам этого никогда не говорил, не советовал и эту приписку за меня написали плохие люди, которые пишут тесты на java под windows на VirtualBox, запущенном на китайском Android телефоне.

3 лайка

Благодарю за ответ.
Действительно на Маке процесс в памяти не висит, только что перепроверил. Тогда надо будет вернуться к выяснению причин слива памяти.
Про kill процесса по ssh думал, но отказался именно ввиду его костыльности :smile:

Почему на Маке тесты гоняю? - нужна была проверка сайтов через внешний забугорный сервер, админы нашли Мак мини в одном из офисов компании и выделили его. Хотя изначально всё было сделано на VPS под Ubuntu (DigitalOcean) c Xvfb и горя никто не знал :sunny:

Похоже админ не правильно определил по логам причину утечки памяти. +1 к этому тот факт что после прекращения запуска теста, соответственно и запуска Firefox - через некоторое время Мак мини всё равно повис от утечки памяти, хотя на нём ничего не запускалось, кроме chromedriver. Кстате, где в Маке могу найти логи, по которым смогу понять кто втихоря сожрал всю память?

Тест точно не падал - в логе Jenkins это сразу было б видно, а так сработал exception на коннект к selenium server.

Утечка памяти — такого понятия как такового не существует. Какой-то процесс отожрал всю память и подвис — такое бывает. В логах это не отображается. В момент, когда вы полагаете, что у вас произошла утечка памяти зайдите на удалённую машину и в терминале посмотрите через команду htop (ставится через macports) кто именно в данный момент времени жрёт память. Возможно это процесс, который никак не будет связан с вашими тестами (какой-нить хитрый драйвер принтера).

[quote=“jeka, post:3, topic:3844”]
VPS под Ubuntu (DigitalOcean) c Xvfb
[/quote]Подскажите, пожалуйста, решение для работы с Xvfb под Python.
Для Ruby использую Headless.

Xvfb под Python - pyvirtualdisplay.

Непосредственно этой библиотекой я не пользовался в своём тесте. Но она есть в нашем фреймворке, вот пару строк кода для примера:

from pyvirtualdisplay import Display

display = Display(visible=0, size=(1024, 758))
display.start()
time.sleep(2)
self.global_display = display

Для моего теста нужно было чтоб Xvfb уже был запущен на удалённом VPS. Для этого нужно было станцевать с бубном, если кому надо будет опишу движения танца :smile:

1 лайк