Search code examples
pythongoogle-chromeselenium-webdriverselenium-chromedriver

python selenium element cant be interacted


I am trying to run this basic python selenium script but I kept getting the element not interactable error.

I tried switching from By.Name to By.ID and even By.XPATH just to see if it was because the chromedriver cant recognise the NAME but neither works

import time

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager

# set up chromedriver
service = ChromeService(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)


try:

    driver.get('https://www.google.com/')
    search_bar = driver.find_element(By.NAME, 'q')
    search_bar.send_keys("cats")
    
    button = driver.find_element(By.NAME, 'btnK')
    driver.implicitly_wait(2)
    button.click()
    # Click on the search bar to focus it
    ActionChains(driver).click(search_bar).perform()
    search_bar.send_keys(Keys.RETURN)

    time.sleep(5)

except Exception as e:
    print(f"an error occured: {e}")

finally:
    driver.quit()


I tried a delay just to give the website time to load as well as a focus on the button. H

/usr/local/bin/python3.10 /Users/someone/Desktop/sel_tut/locating_elems.py 
an error occured: Message: element not interactable
  (Session info: chrome=117.0.5938.88)
Stacktrace:
0   chromedriver                        0x0000000104bbed58 chromedriver + 4336984
1   chromedriver                        0x0000000104bb6dd4 chromedriver + 4304340
2   chromedriver                        0x00000001047e38b4 chromedriver + 293044
3   chromedriver                        0x0000000104823078 chromedriver + 553080
4   chromedriver                        0x0000000104821a94 chromedriver + 547476
5   chromedriver                        0x000000010481e200 chromedriver + 532992
6   chromedriver                        0x0000000104863908 chromedriver + 817416
7   chromedriver                        0x000000010481ca5c chromedriver + 526940
8   chromedriver                        0x000000010481d908 chromedriver + 530696
9   chromedriver                        0x0000000104b84da4 chromedriver + 4099492
10  chromedriver                        0x0000000104b89260 chromedriver + 4117088
11  chromedriver                        0x0000000104b8f4ec chromedriver + 4142316
12  chromedriver                        0x0000000104b89d60 chromedriver + 4119904
13  chromedriver                        0x0000000104b61a34 chromedriver + 3955252
14  chromedriver                        0x0000000104ba6a08 chromedriver + 4237832
15  chromedriver                        0x0000000104ba6b84 chromedriver + 4238212
16  chromedriver                        0x0000000104bb6a4c chromedriver + 4303436
17  libsystem_pthread.dylib             0x0000000193c1bfa8 _pthread_start + 148
18  libsystem_pthread.dylib             0x0000000193c16da0 thread_start + 8

I tried testing out advice from similar issue here in stackoverflow so far none works. Thank you so much in advance for those who response!


Solution

  • Google will by default hide the search bar and buttons and show a "Before you continue to Google" pop-up, that is the reason why you can't access some dom elements. here is a quick fix :

    import time
    
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.chrome.service import Service as ChromeService
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from webdriver_manager.chrome import ChromeDriverManager
    
    # set up chromedriver
    service = ChromeService(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    
    try:
    
        driver.get('https://www.google.com/')
        # accept eula
        accept_button = driver.find_element(By.ID, 'L2AGLb')
        accept_button.click()
    
        search_bar = driver.find_element(By.NAME, 'q')
        search_bar.send_keys("cats")
        
        button = driver.find_element(By.NAME, 'btnK')
        driver.implicitly_wait(2)
        button.click()
        # requery for search bar since page changed
        search_bar = driver.find_element(By.NAME, 'q')
        # Click on the search bar to focus it
        search_bar.click()
        search_bar.send_keys(Keys.RETURN)
    
        time.sleep(5)
    
    except Exception as e:
        print(f"an error occured: {e}")
    
    finally:
        driver.quit()