Home > other >  Finding elements using selenium in python
Finding elements using selenium in python

Time:12-30

I am trying to find and then fill in the username and password of Instagrams login page using:

from selenium.webdriver.common.keys import Keys
import os
from selenium import webdriver
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'Chromedriver')
driver = webdriver.Chrome(executable_path = filename)
driver.get("https://www.instagram.com")
username = driver.find_element_by_name("username")
password = driver.find_element_by_name("password")

username.send_keys("blankspace")
password.send_keys("blankspace")

however, I keep getting an error that it cant detect the element even though the name is correct

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="username"]"}

The HTML:

<input aria-label="Phone number, username, or email" aria-required="true" autocapitalize="off" autocorrect="off" maxlength="75" name="username" type="text"  value="">

CodePudding user response:

You have to close the cookie consent popup first before accessing the form fields:

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


dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, 'Chromedriver')
driver = webdriver.Firefox()
driver.get("https://www.instagram.com")

WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "button.aOOlW.bIiDR"))
)
driver.find_element(By.CSS_SELECTOR, "button.aOOlW.bIiDR").click()

username = driver.find_element(By.NAME, "username")
password = driver.find_element(By.NAME, "password")

username.send_keys("blankspace")
password.send_keys("blankspace")

driver.close()

Also consider using the updated methods find_element():

DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instea

CodePudding user response:

I would check out Selenium documentation! Link. By going off the docs you could try the following:

username = browser.find_element(By.NAME, "username")
password = browser.find_element(By.NAME, "password")
username.send_keys("text")
password.send_keys("text")

Though I would use XPATH instead as it would be quicker:

username = browser.find_element(By.XPATH, '//[@id="loginForm"]/div/div[1]/div/label/input')
password = browser.find_element(By.XPATH, '//*[@id="loginForm"]/div/div[2]/div/label/input')
username.send_keys("text")
password.send_keys("text")

Enjoy!

CodePudding user response:

The answer to anyone who cares to know is that Instagram loads in the body of the page after you get to it so you just have to add a delay before you start looking for the elements. Thats to @edd for pointing that out

driver.get("https://www.instagram.com")
time.sleep(5)
username = driver.find_element_by_name("username")
password = driver.find_element_by_name("password")

username.send_keys("blankspace")
password.send_keys("blankspace")
  • Related