А что касается локальных сервисов SE - просто не забывайте время от времени очищать ОС от потерянных драйверов селена, о которых вы забыли :)

которым неизвестным причинам мой браузер очень медленно открывает тестовые страницы моего удаленного сервера. Поэтому я думаю, смогу ли я снова подключиться к браузеру после выхода из скрипта, но не выполнюwebdriver.quit() это оставит браузер открытым. Это, вероятно, вид крючка или ручки веб-драйвера. Я просмотрел документацию по selenium API, но не нашел никакой функции. Я использую Chrome 62, x64, Windows 7, Селен 3.8.0. Я буду очень признателен за решение вопроса.

 Grasshopper18 дек. 2017 г., 05:37
Вы пытались повторно использовать существующий каталог пользователя Chrome, используя опцию 'user-data-dir' вместо webdriver, каждый раз создавая новый. Вместо загрузки Chrome будет использовать вещи из кеша.
 Alan18 дек. 2017 г., 05:30
Где твой код?
 imbaiye18 дек. 2017 г., 08:18
Это кеш, помогающий загружать страницу так быстро
 imbaiye18 дек. 2017 г., 07:24
@ Grasshopper Что это за черная магия? Я использовал этот Chromeoption. И он уменьшил время загрузки. Я поищу это. Большое спасибо.

Ответы на вопрос(3)

Решение Вопроса

нет, вы не можете подключиться к предыдущемуWeb Browser сессия после выхода из сценария. Даже если вы можете извлечьSession ID, Cookies и другие атрибуты сеанса из предыдущегоBrowsing Session тем не менее вы не сможете передать эти атрибуты в качестве КРЮКАWebDriver.

Более чистым способом было бы позвонитьwebdriver.quit() а затем охватить новыйBrowsing Session.

История:

Ранее были некоторые обсуждения и попытки восстановитьWebDriver в существующий текущий сеанс просмотра. Вы можете найти обсуждения в этих QA:

Allow webdriver to attach to a running browser[docs] webdriver.firefox.useExisting not implemented
 imbaiye18 дек. 2017 г., 07:18
Вы полностью поняли и разрешили мою путаницу. Я сделаю уборку. Большое спасибо.

почему вы думаете, что оставление открытых окон браузера решит проблему медлительности, вам не нужен дескриптор для этого. Просто продолжайте выполнять тесты, не закрывая сеанс или, другими словами, не вызываяdriver.quit() как вы упомянули сами. Вопрос здесь, хотя рамки, которые идут со своим собственным бегуном? Как огурец?

В любом случае у вас должен быть какой-то код «настройки» и «очистки». Поэтому вам нужно убедиться, что на этапе «очистки» браузер вернулся в исходное состояние. Это значит:

Пустая страница отображаетсяКукисы стираются за сеанс
 imbaiye18 дек. 2017 г., 06:39
Функция <code> webdriver.Chrome.get (url) </ code> будет ожидать полной загрузки страницы. Для загрузки удаленной страницы потребуется много времени. Поэтому я хочу открыть и загрузить страницу один раз. Я думаю, что веб-драйвер все еще работает в фоновом режиме после того, как я вышел из скрипта. Поэтому я хочу найти дескриптор для веб-драйвера и повторно подключиться к веб-драйверу, чтобы повторно использовать открытую страницу
 imbaiye18 дек. 2017 г., 06:49
Мой плохой английский. Это мой плохой.
 Eugene S18 дек. 2017 г., 06:41
Вы отредактировали свой комментарий после того, как я опубликовал ответ, но посмотрите, поможет ли это.
 Eugene S18 дек. 2017 г., 06:37
Таким образом, в таком случае установочный код откроет браузер и перейдет на эту страницу для вас, затем вы запустите все свои тесты, а часть очистки закроет окно и браузер. Это не выглядит хорошей практикой, поскольку вы добавляете возможные проблемы из-за отсутствия чистой сессии каждый раз, но можете работать в качестве обходного пути. Также не уверен, как будет вести себя страница, если вы удалите куки после теста обучения.
 imbaiye18 дек. 2017 г., 06:48
Я сожалею об этом .Stackoverflow устанавливает время редактирования 5 минут. И почти каждый раз, когда я делаю это время.
даэто на самом деле довольно легко сделать.

-> веб-драйвера представлен URL-адресом соединения и сессионным идентификатором, вы просто переподключаетесь к существующему.

отказ - подход использует внутренние свойства селена (в некотором роде «частные»), которые могут изменяться в новых выпусках; вам лучше не использовать его для производственного кода; Лучше не использовать его против удаленного SE (вашего хаба или провайдера, такого как BrowserStack / Sauce Labs), потому что в конце объясняется утечка caveat / resource.

Когда запускается экземпляр веб-драйвера, вам необходимо получить вышеупомянутые свойства; образец:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.google.com/')

# now Google is opened, the browser is fully functional; print the two properties
# command_executor._url (it's "private", not for a direct usage), and session_id

print(f'driver.command_executor._url: {driver.command_executor._url}')
print(f'driver.session_id: {driver.session_id}')

Теперь, когда эти два свойства известны, другой экземпляр может соединиться; «хитрость» заключается в том, чтобы инициироватьRemote водитель, и предоставить_url выше - таким образом, он подключится к этому запущенному процессу селена:

driver2 = webdriver.Remote(command_executor=the_known_url)  
# when the started selenium is a local one, the url is in the form 'http://127.0.0.1:62526'

Когда он будет запущен, вы увидите, что открывается новое окно браузера.
Это связано с тем, что после запуска драйвера библиотека selenium автоматически запускает для него новый сеанс - и теперь у вас есть 1 процесс веб-драйвера с двумя сеансами (экземплярами браузера).

Если вы перейдете к URL-адресу, вы увидите, что он выполняется на том новом экземпляре браузера, а не на том, который остался от предыдущего запуска, что не соответствует желаемому поведению.
На этом этапе необходимо сделать две вещи: а) закрыть текущий сеанс SE («новый») и б) переключить этот экземпляр на предыдущий сеанс:

if driver2.session_id != the_known_session_id:   # this is pretty much guaranteed to be the case
    driver2.close()   # this closes the session's window - it is currently the only one, thus the session itself will be auto-killed, yet:
    driver2.quit()    # for remote connections (like ours), this deletes the session, but does not stop the SE server

# take the session that's already running
driver2.session_id = the_known_session_id

# do something with the now hijacked session:
driver.get('https://www.bing.com/')

И это все - теперь вы подключены к предыдущему / уже существующему сеансу со всеми его свойствами (куки, LocalStorage и т. Д.).

Кстати, вам не нужно предоставлятьdesired_capabilities при запуске нового удаленного драйвера - они сохраняются и наследуются от существующего сеанса, который вы установили.

Предостережение - запуск процесса SE может привести к некоторому истощению ресурсов в системе.

Всякий раз, когда один запускается, а затем не закрывается - как в первом фрагменте кода - он будет оставаться там до тех пор, пока вы не убьете его вручную. Под этим я подразумеваю - например, в Windows - вы увидите процесс «chromedriver.exe», который вы должны завершить вручную, как только закончите с ним. Он не может быть закрыт драйвером, который подключился к нему, как к процессу удаленного селена.
Причина - всякий раз, когда вы запускаете локальный экземпляр браузера, а затем вызываете егоquit() метод, он состоит из двух частей - первая состоит в том, чтобы удалить сеанс из экземпляра Selenium (что было сделано во второй части кода там), а другая - остановить локальную службу (chrome / geckodriver) - что в целом работает нормально.

Дело в том, что для удаленных сеансов отсутствует вторая часть - ваш локальный компьютер не может управлять удаленным процессом, это работа центра удаленного управления. Так что вторая часть буквальноpass Заявление Python - нет оп.

Если вы запустите слишком много служб Selen на удаленном концентраторе и не будете управлять им - это приведет к истощению ресурсов с этого сервера. Облачные провайдеры, такие как BrowserStack, принимают меры против этого - они закрывают сервисы без активности в течение последних 60-х и т. Д., И все же - это то, что вы не хотите делать.

А что касается локальных сервисов SE - просто не забывайте время от времени очищать ОС от потерянных драйверов селена, о которых вы забыли :)

Ваш ответ на вопрос