Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29

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

12.01.2023, 23:39. Показов 2742. Ответов 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
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 11:33  [ТС]
Что, товарищи программисты, сложно ? Да, это вам не ЕГЭ и не вывод всех гласных из предложения
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.01.2023, 11:58
DK100, вообще не сложно, два процесса и пайп или очередь между ними. Первый процесс создает драйвера, стартует процесс второго скрипта и в очередь засыпает свои драйверы. Второй скрипт из очереди или пайпа все достает и использует как хочет.

а главное не забывайте что вам никто ничего не должен, с задачами помогают по мере интереса к ним, а тут задача явно неверно спроектирована.
0
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 12:16  [ТС]
Тут прошу уточнить, что вы имеете в виду. Первый процесс стартует процесс второго скрипта? Если Вы это имели в виду, то это не подходит совсем.
Где эта очередь хранится?
Ну хотя бы пример обрисуете в двух строчках кода.

Хотя бы схематично с пайпом, так как я с ним вообще не сталкивалась
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.01.2023, 12:23
DK100, странно что не подходит, а чем это отличается от того что скрипт запустят руками? тут просто будет запущен отдельный процесс, они между собой могут делиться данными, это упростит дело. Строчек кода не будет, читаем документацию по мультипроцессинг.

Что товарищи новички, сложно? это вам не посты в ВК читать!

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

Еще раз повторю, что то не так с самой задачей, скорее всего спланирована тем, кто не имеет представления о том как такие вещи решают. Почему второй скрипт не может сам драйвера поднять? Почему 1 не может их использовать? почему в рамках одной программы это не решить с использованием событий и таймаутов, если нужно ждать какого то события?
0
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 12:24  [ТС]
Или что значит очередь между ними? Планируется множество скриптов , которые будут обращаться к подготовленным вебрдайверам. (разумеется обращаться они будут только к тем, которые не заняты, что бы не пересекаться, как только объект был "взят", он уходит в чёрный список)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.01.2023, 12:25
ссылку на очередь дал выше
0
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 12:35  [ТС]
В рамках одного скрипта это было уже давно сделано и с мультипроцесами и тредами итд. Зачем и почему так? Потому что таковы условия и дело не в проектировании задачи. Так сложилось, что нужно именно вот так сделать.

Добавлено через 5 минут
Меня интересует как именно 10 скриптов, обратятся к первому за его объектами? Как они увидят его?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.01.2023, 12:40
ну попробуй еще пиклом десериализовать драйвера и через сокет кинуть второму скрипту, заодно узнаешь сработат ли)

Добавлено через 1 минуту
Цитата Сообщение от DK100 Посмотреть сообщение
Меня интересует как именно 10 скриптов, обратятся к первому за его объектами? Как они увидят его?
если он стартанул процессы этих скриптов то им не надо его видеть, он им передаст очердь, она одна на всех и сунет туда драйвера, а они достанут.

Если же это вообще отдельные программы, то или смотреть можно ли переиспользовать порты (а при старте драйвера можно конкретный порт указать) или пикл+сокет (что вряд ли)
0
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 12:58  [ТС]
Вот в этом то и было самое условие, первый скрипт НИКОГО не стартует. И именно с этим условием, реализовать это очень трудно.
Это больше похоже на то, что "Я бы сделал, но мне лень", но, что я сомневаюсь


Без обид
Просто постоянно натыкаюсь на то, что другие люди зачем то закрывают глаза на условия задачи ссылаясь на то, что можно сделать проще, упрощают её и потом говорят, что она не сложная и скучная "Мол вот вам ссылки"

Добавлено через 4 минуты
переиспользовать порты (а при старте драйвера можно конкретный порт указать)

В теории, а на практике он создаст новый драйвер с тем поротом и попытается снова открыть уже запущенный профиль браузера, что приведёт к ошибке.

Добавлено через 4 минуты
Я читала, что можно как то с помощью memcashe, загрузить в память с "ID" и поэтому id вытащить. И при этом использовать первый скрипт как сервер, а остальные как клиент.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.01.2023, 13:20
Цитата Сообщение от DK100 Посмотреть сообщение
Я читала, что можно как то с помощью memcashe, загрузить в память с "ID" и поэтому id вытащить.
так попробуй, в чем вопрос то тогда? похоже что ждешь готового решения

Цитата Сообщение от DK100 Посмотреть сообщение
И именно с этим условием, реализовать это очень трудно.
еще трудно гвоздь забить микроскопом, но это условие и давайте не отговаривайтесь, что задача какая-то странная)))

Цитата Сообщение от DK100 Посмотреть сообщение
Это больше похоже на то, что "Я бы сделал, но мне лень"
это больше похоже на попытку взять "на слабо", мне не лень, мне эта задача не интересна, я гвозди молотком забиваю.
Без обид.

Что я бы сделал я уже написал -попробовал пикл+ сокет, погуглил про порты драйвера, потому что мне как то попадалась статья на эту тему.
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 13:37  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
так попробуй, в чем вопрос то тогда? похоже что ждешь готового решения
Пробовала, хотела решить с наскоку, не вышло. Подумала, может у кого то есть опыт, обратилась сюда.
Цитата Сообщение от Welemir1 Посмотреть сообщение
еще трудно гвоздь забить микроскопом, но это условие и давайте не отговаривайтесь, что задача какая-то странная)))
Знаете в школе и в университете, ставят ещё более "нерациональные задачи", но никто не спрашивает зачем. И смысл именно в том, что бы через эту ненужную сложность набраться опыта, который пригодится где то потом.
Цитата Сообщение от Welemir1 Посмотреть сообщение
Что я бы сделал я уже написал -попробовал пикл+ сокет, погуглил про порты драйвера, потому что мне как то попадалась статья на эту тему.
Хорошо, почитаю в этом направлении.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
13.01.2023, 16:06
DK100, если бы задача была странная и мне бы студент подошел мол тут тупо как то , я б ему балл повысил) На месте препода имею в виду.
в общем так, если в выходные не забуду - попробую тоже провернуть через сокеты.

Добавлено через 2 часа 26 минут
DK100, вот это посмотри, я давно не пользовался, потому позыбыл что есть такая крутая вещью По сути создаешь сервер и ноды (можно на одной машине, можно на разных) разворачиваешь браузеры нужных версий и любой кто подключится к серверу по его адресу -сможет управлять любым браузером. Как раз вроде твой случай, причем поддерживает параллельность то есть одновременно несколько могут стучаться, лишь бы хватило браузеров на них.
https://www.selenium.dev/documentation/grid/
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
13.01.2023, 16:15  [ТС]
Вооо, вот это уже очень даже похоже на решение
Благодарю, наводка хорошая !
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
14.01.2023, 18:52
Ну допустим, у нас будет 1 объект, который будет смотреть содержимое локального сайта site.html.

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
26
27
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'))
 
        data = self.request.recv(1024)
        if (data.decode('utf-8') == 'OK'):
            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()
script1.py создаёт соединение TCP и ожидает клиента (script2.py) для передачи ему данных текущей сессии WebDriver, поскольку именно эти данные будут использоваться для подключения к открытому вебдрайвером браузеру.

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
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from time import sleep
import socket
 
FILE = 'file:///.../site.html'
 
d = webdriver.Chrome('./chromedriver')
d.get(FILE)
 
el = d.find_element(By.TAG_NAME, 'p')
 
old_text = el.text
text = old_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)
    conn.sendall(bytes('OK', 'utf-8'))
finally:
    conn.close()
 
url = data.split()[0].decode('utf-8')
sid = data.split()[1].decode('utf-8')
d = webdriver.Remote(command_executor=url)
d.session_id = sid;
 
d.get(FILE)
 
el = d.find_element(By.TAG_NAME, 'h1')
print(el.text)
 
d.close()
В script2.py создаётся объект, который тоже смотрит содержимое локального сайта site.html, но также проверяет изменение текста в теге <p>. Как только текст изменяется (что является определённым условием обращения к "подготовленному объекту") - скрипт обращается к запущенному script1.py TCP-серверу и получает необходимые данные: адрес объекта, выполняющего удалённые команды и идентификатор сессии. Затем по этим данным восстанавливается подключение к браузеру, открытому script1.py и в качестве теста выводится текст из тега <h1>.
0
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
14.01.2023, 19:10  [ТС]
Я сейчас в пути, но выглядит, вроде Мощнянски )
Надо затестить, понять то ли это, а т со смартфона тяжко

Добавлено через 5 минут
Пока вопрос на перёд, можно ли тут реализовать передачу например десяти драйверов десяти скриптам ?
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 258
14.01.2023, 20:27
Да, можно
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
14.01.2023, 20:55  [ТС]
К сожалению тут есть загвоздка.
1) Когда скрипт 2 создаёт новый объект, он использует новый чистый профиль браузера, мне нужно, что бы он именно взял управление над первым профайлом браузера, так как он будет содержать, все нужные кукисы и самое важное уникальные токены на оплату итд, а их уже никак не передать. Поэтому, всё что подготовит скрипт 1 не будет иметь смысла. Да, внутренности хтмл будут видны, но там суть не только в этом. Очень важно именно "завладеть" и драйвером и тем подготовленным профайлом веббраузера.

2)Триггер на "перехват" драйвера идёт не из хтмл, скрипт 2 получит сигнал из совершенно другого источника. Поэтому страница не будет меняться никак. Она по сути будет стоять с формуляром или кнопкой и ждать нажатия или ввода. Тут важны куксы, а их не будет во втором скрипте.
Но очень многое я для себя подчеркнула, положила в папочку Ваш скрипт, а вдруг пригодится для других проектов

Добавлено через 2 минуты
Как выше уже человек предложил, наверно Selenium Grid решение моего вопроса.
0
Йуный плагиат-падаван)
176 / 119 / 45
Регистрация: 17.10.2022
Сообщений: 566
14.01.2023, 21:59
Скрипт 1:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from selenium import webdriver
import pickle
 
# Create webdriver objects
driver1 = webdriver.Chrome()
driver2 = webdriver.Firefox()
driver3 = webdriver.Edge()
 
# Perform tasks with webdrivers
driver1.get("https://www.google.com")
driver2.get("https://www.facebook.com")
driver3.get("https://www.twitter.com")
 
# Save webdriver objects to a file
with open("drivers.pickle", "wb") as f:
    pickle.dump((driver1, driver2, driver3), f)
 
# Wait for script 2 to take control of webdrivers
input("Press Enter to continue...")
Срипт 2:
Python
1
2
3
4
5
6
7
8
9
10
11
import pickle
 
# Load webdriver objects from file
with open("drivers.pickle", "rb") as f:
    driver1, driver2, driver3 = pickle.load(f)
 
# Perform tasks and take control of webdrivers
if some_condition:
    driver1.close()
    driver1 = webdriver.Chrome()
    driver1.get("https://www.new_site.com")
Важно отметить, что при запуске скрипта 2 необходимо убедиться, что скрипт 1 уже запущен и завершил выполнение, а объекты драйвера были выделены и сохранены в файл.
Также важно отметить, что вы не можете использовать объект webdriver после его закрытия, вы должны создать его заново после закрытия.

В качестве альтернативы вы можете использовать другие методы межпроцессного взаимодействия, такие как сокеты, очереди сообщений и т.д.
1
2 / 2 / 0
Регистрация: 21.04.2022
Сообщений: 29
14.01.2023, 22:27  [ТС]
К сожалению этот вариант тоже не подходит.

Давайте я поясню.

Скрипт 1
1) Создаёт вебдраивер - открывает определённый профаил браузера.
2) Начинает заполнять разные формы, джава окошки итд. Доводит до определённого момента, до кнопки и стоит ждёт. Всё это невозможно передать ни кукисами, ни хтмл кодом, ни простой урл.
Давайте для простоты возьмём браузерную игру "Ферму" или какие там сейчас есть, а то я далека от этого(мне не для этого нужно, но так будет лучше для представление)
Допустим сохранять нельзя. Вот я первым скриптом посадила морковку, полила капуста и прочую дребедень сделала (всё это пиклом - кукисами не передать), потом скрипт пошёл дальше создавать новый драйвер для второй игры итд. А скрипт номер два должен просто подключится, перенять "бразды правления", и "накормить корову, капустой и морковкой или что они там едят )

Поэтому основное правило никакого закрытия вебдрайвера, а именно того профиля браузера который он открыл и создания нового, так как я просто никак не смогу передать ту уникальную информацию.
Скрипт один должен дождаться скрипт 2, и передать ему полностью "управление" тем профайлом браузера, который был открыт и подготовлен к нажатию копки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2023, 22:27
Помогаю со студенческими работами здесь

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

Передача переменной из одного скрипта в другой
Всем привет. Есть переменная 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(); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru