1

我正在尝试使用 python 中的 selenium 自动化 reddit logIn,并且我正在使用以下代码来执行此操作

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from time import sleep

driver = webdriver.Chrome(executable_path=r'C:\Program Files (x86)\chromedriver.exe')
driver.get("https://www.reddit.com/")

login=driver.find_element_by_link_text("Log In")
login.click()

username = "the-username"          # Enter your username
password = "the-password"                   # Enter your password

def slow_typing(element, text): 
   for character in text: 
      element.send_keys(character)
      sleep(0.3)

def logIn():            # Log In Function.
    try: 
        sleep(15)
        #username_in = driver.find_element_by_class_name("AnimatedForm__textInput")
        username_in = driver.find_element_by_xpath("//*[@id='loginUsername']")
        slow_typing(username_in, username)

        pass_in = driver.find_element_by_xpath("//*[@id='loginPassword']")
        slow_typing(pass_in,password)

        pass_in.send_keys(Keys.ENTER)
        sleep(5)
    except NoSuchElementException:
        print("Llegue aqui xd xd")

logIn()

还有一些代码,但我发布了一个摘要,以便我可以将我的问题告诉你们。当它运行时,会选择输入用户名的那一刻,但它不会发送密钥。我不知道该怎么做或改变,所以我在这里寻求一些帮助。

4

3 回答 3

1
def logIn():            # Log In Function.
    try:
        driver.switch_to_frame(driver.find_element_by_tag_name('iframe'))
        sleep(5)
        print("hii")
        #username_in = driver.find_element_by_class_name("AnimatedForm__textInput")
        username_in = driver.find_element_by_xpath("//*[@id='loginUsername']")
        slow_typing(username_in, username)

        pass_in = driver.find_element_by_xpath("//*[@id='loginPassword']")
        slow_typing(pass_in, password)

        pass_in.send_keys(Keys.ENTER)
        sleep(5)
        driver.switch_to_default_content()
    except NoSuchElementException:
        print("Llegue aqui xd xd")
        driver.switch_to_default_content()

登录首先在一个 iframe 中

于 2021-01-30T19:53:23.250 回答
1

要使用Seleniumreddit中登录,您需要:

  • 诱导WebDriverWait使框架可用并切换到它

  • 诱导WebDriverWait使所需元素成为可点击的。

  • 您可以使用以下任一定位器策略

    • 使用XPATH

      options = webdriver.ChromeOptions() 
      options.add_argument("start-maximized")
      options.add_experimental_option("prefs", { \
          "profile.default_content_setting_values.notifications": 1 
        })
      driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
      driver.get("https://www.reddit.com/")
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[starts-with(@href, 'https://www.reddit.com/login')]"))).click()
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@src, 'https://www.reddit.com/login')]")))
      WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//input[@id='loginUsername']"))).send_keys("debanjanb")
      driver.find_element(By.XPATH, "//input[@id='loginPassword']").send_keys("zergcore")
      driver.find_element(By.XPATH, "//button[@class='AnimatedForm__submitButton m-full-width']").click()
      
  • 注意:您必须添加以下导入:

     from selenium import webdriver
     from selenium.webdriver.support.ui import WebDriverWait
     from selenium.webdriver.common.by import By
     from selenium.webdriver.support import expected_conditions as EC
    
  • 浏览器快照:

reddit_login

于 2021-01-30T21:31:35.833 回答
0

发生这种情况是因为您没有在输入元素内部单击 - 下面您会发现慢速输入方法有一个小变化,如果仔细查看他们的代码,他们也有这些字段的动画,单击输入应该可以解决你的问题。

    def slow_typing(element, text):
       element.click()
       for character in text: 
          element.send_keys(character)
          sleep(0.3)

第二个建议是只要有机会就使用 id 而不是 XPath。Ids 为您提供最佳性能,还有助于框架轻松查找元素,而不是解析整个 DOM 以匹配 xpath。

于 2021-01-30T19:45:17.163 回答