2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29

Передача объекта webdriver из одного запущенного скрипта в другой, при определённом условии

12.01.2023, 23:39. Показов 2796. Ответов 29

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Тема очень сложная

Есть задача, которая на первый взгляд звучит легко, но увы.

Описание задачи.

Скрипт 1.py
Создаёт несколько объектов webdrivera (driver1, driver2, driver3), выполняет определённые задачи с ними и потом просто стоит, ждёт, что-бы передать этот конечный объект в скрипт 2.py."

Скрипт 2.py
Включается в другое совершенно время, выполняет свои задачи и при наступлении определённого условия обращается к этим "уже подготовленным объектам" и перенимает контроль над тем браузером, который был открыт каждым вебдрайвером.

Сразу говорю, никакого пессимизма, со словами "Это не возможно" Всё возможно!
Я гуглила пару дней и примерно поняла в каком направлении нужно копать.
Нужно работать с библиотеками memcash, и сокет (создание сервер, клиент) и вроде как должно получится.

Если у Вас есть какие либо мысли по этому поводу или альтернативные решения, предложения, то буду им рада.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2023, 23:39
Ответы с готовыми решениями:

Вывод значения в ячейку при определенном условии в другой ячейке
Ячейка А1 должна выводить значение "a" при ячейке B1 = "1" либо "2", значение "b" при "3" либо "4", значение "с"...

Передача объекта из одного экземпляра класса в другой с запретом обращаться к методам и свойствам этого объекта
Всем привет! Есть класс, в котором используется объект (MyObject, объявленный в private). При создании второго экземпляра этого класса...

Передача переменной из одного скрипта в другой
Здравствуйте. Помогите разобраться пожалуйста. На unity создаётся программа. Есть два скрипта с#. В первом скрипте принимается значение...

29
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
14.01.2023, 23:39
Студворк — интернет-сервис помощи студентам
Я понимаю, похоже, что "травление объектов" веб-драйвера и передача их через файл не является жизнеспособным решением в данном случае.

Другой вариант, который вы могли бы попробовать, это использование Remote WebDriver, который позволяет вам подключиться к веб-драйверу, запущенному на другой машине или в другом процессе. Таким образом, сценарий 1 может запустить веб-драйвер и продолжать его работу, в то время как сценарий 2 подключается к нему и берет управление на себя.

Вот пример того, как можно использовать RemoteWebDriver в скрипте1:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 
# Start the webdriver
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444/wd/hub',
    desired_capabilities=DesiredCapabilities.CHROME)
 
# Perform tasks with the webdriver
driver.get("https://www.google.com")
 
# Wait for script 2 to take control of the webdriver
input("Press Enter to continue...")
Скрипт 2:
Python
1
2
3
4
5
6
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
 
# Connect to the webdriver started by script 1
driver = webdriver.Remote(
    command_executor='http://127.0.0
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
15.01.2023, 02:31  [ТС]
Цитата Сообщение от DOPIXKMNLD Посмотреть сообщение
Другой вариант, который вы могли бы попробовать, это использование Remote WebDriver, который позволяет вам подключиться к веб-драйверу, запущенному на другой машине или в другом процессе. Таким образом, сценарий 1 может запустить веб-драйвер и продолжать его работу, в то время как сценарий 2 подключается к нему и берет управление на себя.
Вот пример того, как можно использовать RemoteWebDriver в скрипте1:

Да, по моему это оно, прям вот близко
Но у меня выдаёт следующую ошибку.

C:\Users\S1\PycharmProjects\server.py:5: DeprecationWarning: desired_capabilities has been deprecated, please pass in an Options object with options kwarg
driver = webdriver.Remote(
Traceback (most recent call last):
File "C:\Python\Python39\lib\site-packages\urllib3\connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "C:\Python\Python39\lib\site-packages\urllib3\util\connection.py", line 95, in create_connection
raise err
File "C:\Python\Python39\lib\site-packages\urllib3\util\connection.py", line 85, in create_connection
sock.connect(sa)
ConnectionRefusedError: [WinError 10061]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 703, in urlopen
httplib_response = self._make_request(
File "C:\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 398, in _make_request
conn.request(method, url, **httplib_request_kw)
File "C:\Python\Python39\lib\site-packages\urllib3\connection.py", line 239, in request
super(HTTPConnection, self).request(method, url, body=body, headers=headers)
File "C:\Python\Python39\lib\http\client. py", line 1279, in request
self._send_request(method, url, body, headers, encode_chunked)
File "C:\Python\Python39\lib\http\client. py", line 1325, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "C:\Python\Python39\lib\http\client. py", line 1274, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "C:\Python\Python39\lib\http\client. py", line 1034, in _send_output
self.send(msg)
File "C:\Python\Python39\lib\http\client. py", line 974, in send
self.connect()
File "C:\Python\Python39\lib\site-packages\urllib3\connection.py", line 205, in connect
conn = self._new_conn()
File "C:\Python\Python39\lib\site-packages\urllib3\connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x000001BEB582A1F0>: Failed to establish a new connection: [WinError 10061]
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\S1\PycharmProjects\server. py", line 5, in <module>
driver = webdriver.Remote(
File "C:\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdr iver.py", line 270, in __init__
self.start_session(capabilities, browser_profile)
File "C:\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdr iver.py", line 363, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "C:\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdr iver.py", line 426, in execute
response = self.command_executor.execute(driver_com mand, params)
File "C:\Python\Python39\lib\site-packages\selenium\webdriver\remote\remot e_connection.py", line 344, in execute
return self._request(command_info[0], url, body=data)
File "C:\Python\Python39\lib\site-packages\selenium\webdriver\remote\remot e_connection.py", line 366, in _request
response = self._conn.request(method, url, body=body, headers=headers)
File "C:\Python\Python39\lib\site-packages\urllib3\request.py", line 78, in request
return self.request_encode_body(
File "C:\Python\Python39\lib\site-packages\urllib3\request.py", line 170, in request_encode_body
return self.urlopen(method, url, **extra_kw)
File "C:\Python\Python39\lib\site-packages\urllib3\poolmanager.py", line 376, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "C:\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 815, in urlopen
return self.urlopen(
File "C:\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 815, in urlopen
return self.urlopen(
File "C:\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 815, in urlopen
return self.urlopen(
File "C:\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
retries = retries.increment(
File "C:\Python\Python39\lib\site-packages\urllib3\util\retry.py", line 592, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=4444): Max retries exceeded with url: /wd/hub/session (Caused by NewConnectionError('<urllib3.connection. HTTPConnection object at 0x000001BEB582A1F0>: Failed to establish a new connection: [WinError 10061]

Добавлено через 56 секунд
Извиняюсь за полотно

Добавлено через 3 минуты
Пишет, что не смог создать соединение, так как целевой компьютер отказал в соединении

Добавлено через 2 часа 28 минут
Вот я ступила
В общем так.

1)Устанавливаем Java
2)Скачиваем webdriver server .jar
3)Запускаем Server.jar в cmd

А остальное завтра )
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
15.01.2023, 10:31
DK100, Похоже, что проблема связана с подключением к RemoteWebDriver. Сообщение об ошибке 'ConnectionRefusedError: [WinError 10061]' указывает на то, что соединение с указанным исполнителем команд (http://127.0.0.1:4444/wd/hub) отклоняется.
Это может быть связано с тем, что сервер selenium не запущен на вашей машине или сервер настроен неправильно.
Чтобы использовать RemoteWebDriver, вам необходимо запустить сервер selenium на вашей машине. Вы можете скачать jar-файл сервера selenium по этой ссылке: https://www.selenium.dev/downloads/.
Затем вы можете запустить сервер с помощью следующей команды: java -jar selenium-server-standalone-*.jar
После запуска сервера вы можете выполнять свои скрипты.
Также важно отметить, что в методе Remote следует использовать 'options' вместо 'desired_capabilities', так как desired_capabilities было устаревшим, как указано в предупреждающем сообщении.
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
16.01.2023, 18:16
Ой, я не заметил, что script2.py открывает новый профайл (что происходит при инициализации вебдрайвера по умолчанию)... Придётся переписать стандартный класс инициализации и передать в него идентификатор сессии.

script2.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from time import sleep
import socket
from typing import List
from typing import Union
from selenium.webdriver.common.options import BaseOptions
from selenium.webdriver.remote.errorhandler import ErrorHandler
 
class RemoteExisting (webdriver.remote.webdriver.WebDriver):
    def __init__(
        self,
        session_id,
        command_executor="http://127.0.0.1:4444",
        desired_capabilities=None,
        browser_profile=None,
        proxy=None,
        keep_alive=True,
        file_detector=None,
        options: Union[BaseOptions, List[BaseOptions]] = None,
    ):
        capabilities = {}
        _ignore_local_proxy = False
        self.command_executor = command_executor
        if isinstance(self.command_executor, (str, bytes)):
            self.command_executor = \
                webdriver.remote.webdriver.get_remote_connection(
                    capabilities,
                    command_executor=command_executor,
                    keep_alive=keep_alive,
                    ignore_local_proxy=_ignore_local_proxy,
                )
        self.session_id = session_id
        self.error_handler = ErrorHandler()
        pass;
 
d = webdriver.Chrome('./chromedriver')
d.get('file:///.../site.html')
 
el = d.find_element(By.TAG_NAME, 'p')
 
text = old_text = el.text
while text == old_text:
    d.refresh()
    sleep(1)
    el = d.find_element(By.TAG_NAME, 'p')
    text = el.text
print(text + ' != ' + old_text)
d.close()
 
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('localhost', 25255))
try:
    data = conn.recv(1024)
finally:
    conn.close()
 
url = data.split()[0].decode('utf-8')
sid = data.split()[1].decode('utf-8')
d = RemoteExisting(sid, command_executor=url)
 
sleep(5)
 
d.get('https://www.python.org')
 
el = d.find_element(By.TAG_NAME, 'h1')
print(el.text)
 
sleep(5)
 
d.close()
Ну да, и self.server.shutdown() не просто закрывает сервер...

script1.py
Code
1
2
3
4
5
6
7
class ThreadedTCPRequestHandler (socketserver.BaseRequestHandler):
     def handle (self):
         d = self.server.mycustomdata
         data = '%s %s' %(d.command_executor._url, d.session_id)
         self.request.sendall(bytes(data, 'utf-8'))
+        input('Press any key to shutdown the server...')
         self.server.shutdown()
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
16.01.2023, 19:37  [ТС]
У меня в первом скрипте, при запуске сервера выдаёт ошибку

self.server.shutdown()
AttributeError: module 'self' has no attribute 'server'

Что делать, как быть?
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
16.01.2023, 19:54
Да нет, это часть скрипта (я привёл окрестность кода, в которой сделал измнение), а не сам script1.py. А, ну... В этом треде он ждёт ответа клиента, а у меня в коде этого уже нет... В общем, вот текущий исходный код script1.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import socketserver
 
class ThreadedTCPRequestHandler (socketserver.BaseRequestHandler):
    def handle (self):
        d = self.server.mycustomdata
        data = '%s %s' %(d.command_executor._url, d.session_id)
        self.request.sendall(bytes(data, 'utf-8'))
        input('Press any key to shutdown the server...')
        self.server.shutdown()
 
class ThreadedTCPServer (socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass;
 
d = webdriver.Chrome('./chromedriver')
d.get('file:///.../site.html')
 
el = d.find_element(By.TAG_NAME, 'h1')
print(el.text)
 
server = ThreadedTCPServer(('localhost', 25255), ThreadedTCPRequestHandler)
server.mycustomdata = d
server.serve_forever()
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
17.01.2023, 10:55  [ТС]
Здравствуйте,
У меня так же второй скрипт создаёт-открывает новый браузер, не перенимая первый.
Всё таки не даром нужно использовать selenium webdriver grid
Вы тестировали, у вас работает или это предположение?
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
17.01.2023, 13:09
Второй скрипт создаёт свою инстанцию chrome, затем закрывает её и подключается к инстанции, созданной первым скриптом. Ведь суть в том, что в начале второй скрипт "выполняет свои задачи", а затем обращается к "подготовленному объекту": d = RemoteExisting(sid, command_executor=url). Через 5 секунд после редактирования текста в теге <p> в site.html, второй скрипт откроет произвольный сайт в окне браузера, открытом первым скриптом. Разве этого не происходит?
0
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
17.01.2023, 15:52  [ТС]
Походу я ступила.
Надо ещё раз тогда вечерком потестить
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
17.01.2023, 17:17
Вот итоговый проект, для общности в предложенном мной:

site.html
HTML5
1
2
3
4
5
6
7
<!DOCTYPE html>
<html>
    <body>
        <h1>Heading</h1>
        <p>Paragraph</p>
    </body>
</html>
script1.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import socketserver
 
class ThreadedTCPRequestHandler (socketserver.BaseRequestHandler):
    def handle (self):
        d = self.server.mycustomdata
        data = '%s %s' %(d.command_executor._url, d.session_id)
        self.request.sendall(bytes(data, 'utf-8'))
        input('Press any key to shutdown the server...')
        self.server.shutdown()
 
class ThreadedTCPServer (socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass;
 
d = webdriver.Chrome('./chromedriver')
d.get('file:///.../site.html')
 
el = d.find_element(By.TAG_NAME, 'h1')
print(el.text)
 
server = ThreadedTCPServer(('localhost', 25255), ThreadedTCPRequestHandler)
server.mycustomdata = d
server.serve_forever()
script2.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from time import sleep
import socket
from typing import List
from typing import Union
from selenium.webdriver.common.options import BaseOptions
from selenium.webdriver.remote.errorhandler import ErrorHandler
 
class RemoteExisting (webdriver.remote.webdriver.WebDriver):
    def __init__(
        self,
        session_id,
        command_executor="http://127.0.0.1:4444",
        desired_capabilities=None,
        browser_profile=None,
        proxy=None,
        keep_alive=True,
        file_detector=None,
        options: Union[BaseOptions, List[BaseOptions]] = None,
    ):
        capabilities = {}
        _ignore_local_proxy = False
        self.command_executor = command_executor
        if isinstance(self.command_executor, (str, bytes)):
            self.command_executor = \
                webdriver.remote.webdriver.get_remote_connection(
                    capabilities,
                    command_executor=command_executor,
                    keep_alive=keep_alive,
                    ignore_local_proxy=_ignore_local_proxy,
                )
        self.session_id = session_id
        self.error_handler = ErrorHandler()
        pass;
 
d = webdriver.Chrome('./chromedriver')
d.get('file:///.../site.html')
 
el = d.find_element(By.TAG_NAME, 'p')
 
text = old_text = el.text
while text == old_text:
    d.refresh()
    sleep(1)
    el = d.find_element(By.TAG_NAME, 'p')
    text = el.text
print(text + ' != ' + old_text)
d.close()
 
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('localhost', 25255))
try:
    data = conn.recv(1024)
finally:
    conn.close()
 
url = data.split()[0].decode('utf-8')
sid = data.split()[1].decode('utf-8')
d = RemoteExisting(sid, command_executor=url)
 
sleep(5)
 
d.get('https://www.python.org')
 
el = d.find_element(By.TAG_NAME, 'h1')
print(el.text)
 
sleep(5)
 
d.close()
Тест-кейс "Делегирование вебдрайвера скрипту"
Предусловие:
Запустить script1.py и script2.py.
Шаги теста:
1. Изменить текст в теге <p> сайта site.html и сохранить файл.
2. Подождать несколько секунд.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2023, 17:17
Помогаю со студенческими работами здесь

Передача параметров из одного скрипта в другой. С#
Есть два скрипта. В одном вызываю метод другого, но в чём-то загвоздка... Что-то с типами не так... ...

Передача переменной из одного скрипта в другой
Всем привет. Есть переменная click(uint),она висит на объекте. надо,чтобы я жмакал на объект2 и эта переменная изменялась. Сам...

Передача значений переменных из одного js-скрипта в другой
Здравствуйте! Есть проблема. Имеется, к примеру, такой HTML-файл: ... &lt;script&gt; ... var a1 = a2, b1 = b2, c1 = c2; ... ...

Delphi, передача интерфейса com-объекта из одного потока, в другой
Здравствуйте. Ситуация такая. Есть приложение делфи. В нём создано два потока. В одном из потоков, объявлен com объект, а именно для...

Передача методу одного объекта ссылки на другой объект
Здравствуйте, совсем недавно начал изучать объектный php и возник следующий вопрос. $c = new C(args); $a = new A(); $b = new B(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru