Невозможно создать две сессии - одна не работает, другая работает
У меня есть пост-запрос в Django views, из которого я вызываю Selenium WebDriver. Я запускаю его в Linux.
Я установил DISPLAY в окружении ОС.
Теперь, когда я вызываю запрос, браузер Selenium открывается нормально, но когда драйвер все еще открыт и я снова вызываю запрос, браузер Selenium не может создать сессию.
В DJANGO используется wsgi
приложение.
Переключение на asgi
может не сработать.
Я ожидал, что будут открыты два драйвера, но на втором драйвере произошел сбой.
Потоковая обработка здесь не проблема
class Test(generics.CreateAPIView):
def create(self, request, *args, **kwargs):
searchDict = dict(request.data)
profile = searchDict['profile']
threading.Thread(target=self.runDriver, args = (profile,)).start()
return Response(status=status.HTTP_200_OK)
def runDriver(self, profile):
br = Driver()
useragent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0'
profile_name = profile
username = 'samsan'
password = '##1234sAMIUL.'
br.createUCDriver(useragent, profile_name)
dr = br.ucDriver
dr.get('https://www.google.com/')
time.sleep(10)
dr.get(dr.current_url)
Это класс Driver:
class Driver:
def __init__(self):
self.driver = None
self.ucDriver = None
self.waitTime = 10
# self.logger = Logger()
# self.executable = input("Please enter chrome executable path: ")
self.executable = "seleniumDriver/chromedriver-mac-arm64/chromedriver"
def createUCDriver(self, user_agent=None, profile_name='Profile 2'):
# os.environ['DISPLAY'] = ':10.0'
options = webdriver.ChromeOptions()
if user_agent:
options.add_argument(f'--user-agent={user_agent}')
print('sys', sys.platform)
if sys.platform == 'darwin':
options.add_argument('--user-data-dir=/Users/yourusername/Library/Application Support/Google/Chrome')
elif sys.platform == 'linux' or sys.platform == 'linux2':
# options.add_argument('--user-data-dir=/home/samiul/.config/google-chrome')
options.add_argument(f'--user-data-dir={Path(__file__).parent.parent.parent / "application" / "local" / "nfs"}')
elif sys.platform == 'win32' or sys.platform == 'win64':
options.add_argument('--user-data-dir=C:\\Users\\User\\AppData\\Local\\Google\\Chrome\\User Data')
options.add_argument(f'--profile-directory={profile_name}')
options.add_argument('--hide-crash-restore-bubble')
options.add_argument("--disable-popup-blocking")
options.add_argument('--disable-features=InfiniteSessionRestore')
options.add_argument('--disable-features=PrivacySandboxSettings4')
if sys.platform == 'darwin':
print('mac')
driver = uc.Chrome(options=options, use_subprocess=True)
elif sys.platform == 'linux' or sys.platform == 'linux2':
service = Service(executable_path=str(Path(__file__).parent/ 'chromeDriver'/ 'chromedriver-linux64' / 'chromedriver'))
print('linux')
# driver = uc.Chrome(options=options, use_subprocess=True, driver_executable_path=Path(__file__).parent/ 'chromeDriver'/ 'chromedriver-linux64' / 'chromedriver')
driver = uc.Chrome(options=options, use_subprocess=True, service = service)
elif sys.platform == 'win32' or sys.platform == 'win64':
print('windows')
try:
driver = uc.Chrome(options=options, use_subprocess=True, driver_executable_path=str(Path(__file__).parent/ 'chromeDriver'/ 'chromedriver-win32' / 'chromedriver.exe'))
except Exception as e:
print('Error in starting Chrome', e)
self.ucDriver = driver
self.ucDriver.set_page_load_timeout(1.5 * 60)
Необходимо было использовать каталог пользователя по умолчанию. Поэтому я удалил строку, задающую каталог пользователя, и теперь все работает.
Проблема заключалась в каталоге google chrome. Вы можете создать только один сеанс хрома с этим каталогом хрома. Это происходит из-за файла SingletonLock, который не позволяет мне создать несколько сеансов с каталогом chrome. Поэтому я сделал обходной путь, прежде чем использовать каталог chrome, я просто скопировал его и поставил отметку о дате в конце его имени. Скопированная папка должна находиться в той же папке, что и оригинальная. Затем я использую каталог chrome для создания сеансов chrome. Как только я закончу. Я просто заменяю оригинальный каталог chrome скопированным, но сохраняю то же оригинальное имя.
Таким образом, я могу создавать много сеансов по мере необходимости. И куки не теряются. Я сохранил один профиль для одной директории.