Selenium / Try to click button in shadow-root?

318 views Asked by At

i try to click the cookie all accept button on this page: https://www.tiktok.com/@shneorgru with the following code

import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from sys import platform
import os, sys
import xlwings as xw
from datetime import datetime, timedelta
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from fake_useragent import UserAgent

if __name__ == '__main__':
  SAVE_INTERVAL = 5
  WAIT = 1
       
  print(f"Checking chromedriver...")
  os.environ['WDM_LOG_LEVEL'] = '0' 
  ua = UserAgent()
  userAgent = ua.random
  options = Options()
  # options.add_argument('--headless')
  options.add_argument("start-maximized")
  options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1})    
  options.add_experimental_option("excludeSwitches", ["enable-automation"])
  options.add_experimental_option('excludeSwitches', ['enable-logging'])
  options.add_experimental_option('useAutomationExtension', False)
  options.add_argument('--disable-blink-features=AutomationControlled')
  options.add_argument(f'user-agent={userAgent}')     
  srv=Service(ChromeDriverManager().install())  
  driver = webdriver.Chrome (service=srv, options=options)    
  waitWebDriver = WebDriverWait (driver, 10)         
  
  link = f"https://www.tiktok.com/@shneorgru" 
  driver.get (link)       
  time.sleep(WAIT) 
  driverElem = driver.find_element(By.XPATH,"//tiktok-cookie-banner")
  root1 = driver.execute_script("return arguments[0].shadowRoot", driverElem)
  root1.find_element(By.XPATH,"(//button)[2]").click()  
  time.sleep(WAIT) 

I try to select first the tag which is around the shadwo-root. Then try to execute the script for the shadowRoot. And then find the element inside the shadowRoot and finally click the button.

But i allways get the following error:

$ python collTikTok.py
Checking chromedriver...
Traceback (most recent call last):
  File "C:\Users\Polzi\Documents\DEV\Fiverr\TRY\rosen771\collTikTok.py", line 56, in <module>
    root1.find_element(By.XPATH,"(//button)[2]").click()
  File "C:\Users\Polzi\Documents\DEV\.venv\selenium\lib\site-packages\selenium\webdriver\remote\shadowroot.py", line 59, in find_element
    return self._execute(
  File "C:\Users\Polzi\Documents\DEV\.venv\selenium\lib\site-packages\selenium\webdriver\remote\shadowroot.py", line 94, in _execute
    return self.session.execute(command, params)
  File "C:\Users\Polzi\Documents\DEV\.venv\selenium\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 425, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Polzi\Documents\DEV\.venv\selenium\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator

How can i click this cookie accept button?

Here is the code how it looks like in the shadow-root:

enter image description here

0

There are 0 answers