peetysmith
peetysmith

Reputation: 123

Element Not Clickable - even though it is there

Hoping you can help. I'm relatively new to Python and Selenium. I'm trying to pull together a simple script that will automate news searching on various websites. The primary focus was football and to go and get me the latest Manchester United news from a couple of places and save the list of link titles and URLs for me. I could then look through the links myself and choose anything I wanted to review.

In trying the the independent newspaper (https://www.independent.co.uk/) I seem to have come up against a problem with element not interactable when using the following approaches:

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys 
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('chromedriver')
driver.get('https://www.independent.co.uk')

time.sleep(3)

#accept the cookies/privacy bit
OK = driver.find_element_by_id('qcCmpButtons')
OK.click()

#wait a few seconds, just in case
time.sleep(5)


search_toggle = driver.find_element_by_class_name('icon-search.dropdown-toggle')
search_toggle.click()

This throws the selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable error

I've also tried with XPATH

search_toggle = driver.find_element_by_xpath('//*[@id="quick-search-toggle"]')

and I also tried ID.

I did a lot of reading on here and then also tried using WebDriverWait and execute_script methods:

element = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@id="quick-search-toggle"]')))
driver.execute_script("arguments[0].click();", element)

This didn't seem to error but the search box never appeared, i.e. the appropriate click didn't happen.

Any help you could give would be fantastic. Thanks, Pete

Upvotes: 3

Views: 114

Answers (3)

Prakash
Prakash

Reputation: 11

Can you try with below steps

search_toggle = driver.find_element_by_xpath('//*[@class="row secondary"]/nav[2]/ul/li[1]/a')

search_toggle.click()

Upvotes: 0

frianH
frianH

Reputation: 7563

Your locator is //*[@id="quick-search-toggle"], there are 2 on the page. The first is invisible and the second is visible. By default selenium refers to the first element, sadly the element you mean is the second one, so you need another unique locator. Try this:

search_toggle = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//div[@class="row secondary"]//a[@id="quick-search-toggle"]')))
search_toggle.click()

Upvotes: 1

Zaraki Kenpachi
Zaraki Kenpachi

Reputation: 5730

First you need to open search box, then send search keys:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import os

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
browser = webdriver.Chrome(executable_path=os.path.abspath(os.getcwd()) + "/chromedriver", options=chrome_options)
link = 'https://www.independent.co.uk'
browser.get(link)

# accept privacy
button = browser.find_element_by_xpath('//*[@id="qcCmpButtons"]/button').click()

# open search box
li = browser.find_element_by_xpath('//*[@id="masthead"]/div[3]/nav[2]/ul/li[1]')
search_tab = li.find_element_by_tag_name('a').click()

# send keys to search box
search = browser.find_element_by_xpath('//*[@id="gsc-i-id1"]')
search.send_keys("python")
search.send_keys(Keys.RETURN)

Upvotes: 1

Related Questions