Evan Gertis
Evan Gertis

Reputation: 2062

How to perform a search in LinkedIn with Selenium web driver

I am generating a bot to scrape LinkedIn profiles. At this time I am able to log into my account. The next step is to enter a name into the search bar.

I've written this script to get started:

# connect python with webbrowser-chrome
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
import time
from selenium.webdriver.support.ui import WebDriverWait
import pyautogui as pag
  

def login_to_linkedin(driver):
  username = driver.find_element_by_id("session_key")
  username.send_keys("[email protected]")
  password = driver.find_element_by_id("session_password")
  password.send_keys("password")
  driver.find_element_by_class_name("sign-in-form__submit-button").click()

def  take_a_screenshot(driver):
  loc_time = time.localtime()
  time_string = time.strftime("%m/%d/%Y", loc_time)
  driver.save_screenshot(time_string+"_screenshot.png")

def  goto_network_page(driver,network_url):
  driver.get(network_url)

def  send_requests_to_users(driver):
  WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "class name of an element")))
  driver.find_element_by_id("global-nav-typeahead")
  driver.send_keys("name")
#   javaScript =  "window.scrollBy(0,4000);"
#   driver.execute_script(javaScript)
#   n =  int(input("Number of requests: "))
#   for i in  range(0, n):
#     pag.click(441, 666)
#   print("Done !")
  
def main():
 
    # url of LinkedIn
    url = "http://linkedin.com/" 
    # path to browser web driver
    driver = webdriver.Chrome(ChromeDriverManager().install())    
    driver.get(url)
    login_to_linkedin(driver)
    send_requests_to_users(driver)
    take_a_screenshot(driver)
 
main()

Expected: the keys for the search should be entered as expected.

Actual: nothing happens in the search bar.

The new error that I am receiving is:

Traceback (most recent call last):
  File "/Users/evangertis/development/mop/source/security-tools/container_scanning/selenium_test.py", line 48, in <module>
    main()
  File "/Users/evangertis/development/mop/source/security-tools/container_scanning/selenium_test.py", line 45, in main
    send_requests_to_users(driver)
  File "/Users/evangertis/development/mop/source/security-tools/container_scanning/selenium_test.py", line 33, in send_requests_to_users
    driver.find_element(By.CSS_SELECTOR, ".search-global-typeahead button").click()
  File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=97.0.4692.71)

Upvotes: 1

Views: 966

Answers (2)

Henul
Henul

Reputation: 232

Try the following (based on Nic's answer):

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

search_text = 'Name'

search_container = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search-global-typeahead')))
if 'focused' not in search_container.get_attribute('class'):
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search-global-typeahead button'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#global-nav-typeahead input'))).send_keys(search_text)
    
search_results = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search-global-typeahead__hit-text')))
if 'focused' not in search_results.get_attribute('class'):
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search-global-typeahead__hit-text'))).click()

Upvotes: 0

Nic Laforge
Nic Laforge

Reputation: 1876

Try the following:

search_container = driver.find_element(By.CSS_SELECTOR, '.search-global-typeahead')

# Click on the search button if the input is not in focus
if 'focused' not in search_container.get_attribute('class'):
    driver.find_element(By.CSS_SELECTOR, ".search-global-typeahead button").click()

driver.find_element(By.CSS_SELECTOR, "#global-nav-typeahead input").send_keys("name")

Upvotes: 1

Related Questions