Ошибка при выборе поля ввода с Selenium - PullRequest
1 голос
/ 20 марта 2020

в следующем коде я пытался выполнить вход в учетную запись Instagram с помощью Selenium с помощью python.

Я использовал разные методы, чтобы найти поле и заполнить их правильными данными, но во всех случаях, он не мог найти элемент.

Это поля, которые я пытался заполнить: Username

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

Пароль:

<input aria-label="Password" aria-required="true" autocapitalize="off" autocorrect="off" name="password" type="password" class="_2hvTZ pexuQ zyHYP" value="">

вот мой код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

class InstagramBot():
    def __init__(self,username, password):
        self.browser = webdriver.Chrome()
        self.username = username
        self.password = password
        time.sleep(4)

    def login(self):
        self.browser.get('https://www.instagram.com/accounts/login')

        usernameInput = self.browser.find_element_by_name('username')
        passwordInput = self.browser.find_element_by_name('password')
        usernameInput.send_keys(self.username)
        passwordInput.send_keys(self.password)
        self.browser.send_keys(Keys.ENTER)
        time.sleep(2)


bot = InstagramBot('MY_USERNAME', 'MY_PASSWORD')
bot.login()

Ответы [ 2 ]

1 голос
/ 20 марта 2020

В вашем сценарии нет ничего плохого, просто дождитесь загрузки страницы, используя WebDriverWait

Или переместите time.sleep(4) после self.browser.get('https://www.instagram.com/accounts/login')

def login(self):
    self.browser.get('https://www.instagram.com/accounts/login')
    time.sleep(4)
    usernameInput = self.browser.find_element_by_name('username')
    passwordInput = self.browser.find_element_by_name('password')
    usernameInput.send_keys(self.username)
    passwordInput.send_keys(self.password)
1 голос

Вероятно, вы ищете элемент до того, как ваша страница даже загрузится, поскольку вы сразу же ищете элементы после метода get браузера, лучший способ - это не сон, а ожидание

try:

from selenium import webdriver                                                  
from selenium.webdriver.common.keys import Keys                                 
from selenium.webdriver.common.by import By                                     
from selenium.webdriver.support.ui import WebDriverWait                         
from selenium.webdriver.support import expected_conditions as EC                
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
import time
import sys

### your browser definition etc
wait  = WebDriverWait(browser, 4)
# now your browser will wait for 4 seconds and will throw an error if he didnt finds the element
try:
    wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="STRUCTURED_EDITOR.FLIGHT_DATA_AREA.GENERAL_DATA_ENTRY.AIRCRAFT_ID_FIELD"]')))
except TimeoutException:
    print("time error")
    self.browser.quit()

element_drop_down = self.browser.find_element_by_xpath('//*[@id="STRUCTURED_EDITOR.FLIGHT_DATA_AREA.GENERAL_DATA_ENTRY.AIRCRAFT_ID_FIELD"]')
element_drop_down.send_keys("{}".format(my_var))

Также проверьте если есть несколько кадров, вам нужно переключить кадр, если элемент находится внутри дополнительного кадра

...