2

Its my first time try on selenium, it failed at click action. If i add time.sleep(1) before click action, it works.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://google.com")

googleSearchBox = driver.find_element(By.ID, "APjFqb")
googleSearchBox.send_keys("test")
# time.sleep(1)
driver.find_element(By.NAME, "btnK").click()

and the error message shows

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=115.0.5790.170)
Stacktrace:
0   chromedriver                        0x000000010049aa6c chromedriver + 4303468
1   chromedriver                        0x0000000100493198 chromedriver + 4272536
2   chromedriver                        0x00000001000c73ec chromedriver + 291820
3   chromedriver                        0x0000000100105f60 chromedriver + 548704
4   chromedriver                        0x00000001000fa958 chromedriver + 502104
5   chromedriver                        0x00000001000fa220 chromedriver + 500256
6   chromedriver                        0x000000010013d628 chromedriver + 775720
7   chromedriver                        0x00000001000f8b40 chromedriver + 494400
8   chromedriver                        0x00000001000f9988 chromedriver + 498056
9   chromedriver                        0x000000010045b924 chromedriver + 4045092
10  chromedriver                        0x000000010045fe68 chromedriver + 4062824
11  chromedriver                        0x0000000100466088 chromedriver + 4087944
12  chromedriver                        0x000000010046096c chromedriver + 4065644
13  chromedriver                        0x0000000100438e64 chromedriver + 3903076
14  chromedriver                        0x000000010047c55c chromedriver + 4179292
15  chromedriver                        0x000000010047c6b4 chromedriver + 4179636
16  chromedriver                        0x000000010048c978 chromedriver + 4245880
17  libsystem_pthread.dylib             0x00000001a523ffa8 _pthread_start + 148
18  libsystem_pthread.dylib             0x00000001a523ada0 thread_start + 8

Can anyone help to explain on this?

Yuchen
  • 21
  • 3
  • 1
    Basically, it takes time to load the page which is why the `sleep()` works. The alternative is to use `EC` for expected conditions to check that the components have loaded... – D.L Aug 05 '23 at 15:03

2 Answers2

1

I don't see any issues in your code - it passes.

Anyway, you can try to wait for element to be clickable:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

wait = WebDriverWait(driver, 10)
driver.get("https://google.com")

googleSearchBox = driver.find_element(By.ID, "APjFqb")
googleSearchBox.send_keys("test")
wait.until(EC.element_to_be_clickable(driver.find_element(By.NAME, "btnK"))).click()
Yaroslavm
  • 1,762
  • 2
  • 7
  • 15
1

This error message...

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

...implies that the desired element was not interactable when you tried to invoke click on it.


Solution

To send a character sequence with the Search field on Google Home Page and to click on the Google Search button you need to induce WebDriverWait for the element_to_be_clickable() and you can use either of the following locator strategies:

  • Using NAME:

    driver.get(url='https://www.google.com/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q"))).send_keys("Yuchen" +Keys.RETURN)
    
  • Using CSS_SELECTOR:

    driver.get(url='https://www.google.com/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "textarea[name='q']"))).send_keys("Yuchen" +Keys.RETURN)
    
  • Using XPATH:

    driver.get(url='https://www.google.com/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//textarea[@name='q']"))).send_keys("Yuchen" +Keys.RETURN)
    
  • Note: You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Browser snapshot:

Yuchen

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352