【问题标题】:Error while selecting input field with Selenium使用 Selenium 选择输入字段时出错
【发布时间】:2020-03-19 21:05:51
【问题描述】:

在以下代码中,我尝试使用 Selenium 和 python 登录 Instagram 帐户。

我使用了不同的方法来定位字段并用适当的数据填充它们,但在所有情况下,它都找不到元素。

这些是我试图填写的字段: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()

【问题讨论】:

    标签: python selenium authentication xpath instagram


    【解决方案1】:

    您的脚本没有问题,只需等待页面加载使用WebDriverWait

    或者在self.browser.get('https://www.instagram.com/accounts/login')之后移动time.sleep(4)

    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)
    

    【讨论】:

      【解决方案2】:

      可能你在页面加载之前搜索元素,因为你在浏览器获取方法之后立即搜索元素,最好的方法不是睡眠,而是等待

      尝试:

      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))
      

      还要检查是否有多个框架,如果元素在辅助框架内,则需要切换框架

      【讨论】:

      • 嘿伙计,感谢您的回复。你能告诉我应该把你提到的代码放在哪里吗?
      • 哦,对不起,把它放在你的浏览器后面。获取你想要找到元素的页面。检查错别字,因为我给出了一个一般的例子
      猜你喜欢
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2021-04-12
      相关资源
      最近更新 更多