Невозможно создать две сессии - одна не работает, другая работает

У меня есть пост-запрос в 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 скопированным, но сохраняю то же оригинальное имя.

Таким образом, я могу создавать много сеансов по мере необходимости. И куки не теряются. Я сохранил один профиль для одной директории.

Вернуться на верх