【问题标题】:Need Help Trying to identify the username section and pw section of a page (python selenium)需要帮助尝试识别页面的用户名部分和 pw 部分(python selenium)
【发布时间】:2020-08-17 12:25:17
【问题描述】:

我本质上是 scraping chegg,我需要帮助来尝试识别 css id="emailForSignIn" 我正在尝试找到一种方法来检测登录部分的文本栏在 chegg 登录页面的位置

下面是实现的功能:

def signin():  # Only use this function if you are using new instances of your browser each time
    print('>>signing in!')
    browser.get('https://www.chegg.com/auth?action=login&redirect=https%3A%2F%2Fwww.chegg.com%2F')
    handle_captcha()

    time.sleep(2)
    email_elem = browser.find_element_by_id('emailForSignIn')
    for character in 'alondra_calderon@ymail.com':
        email_elem.send_keys(character)
        time.sleep(0.1)
    time.sleep(2)

    password_elem = browser.find_element_by_id('passwordForSignIn')
    for character in 'Blueyes97':
        password_elem.send_keys(character)
        time.sleep(0.1)
    time.sleep(2)

    browser.find_element_by_name('login').click()

    try:
        if WebDriverWait(browser, 5).until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[3]/div[2]/div[2]/div/div[3]/div/oc-component/div/div/div/div[2]/div[1]/div[1]/div/form/div/div/div/div/div[3]/span"))):
            print('redirecting back to login')
            browser.get('https://www.chegg.com/auth?action=login')
            handle_captcha()
            signin()
            handle_captcha()
    except TimeoutException:
        pass

    if browser.find_element_by_tag_name('h1').text == 'Oops, we\'re sorry!':
        return [0]
    handle_captcha()

以下是错误:

PS C:\Users\Dami\Desktop\chegg_discord_bot-master>  & 'C:\Program Files (x86)\Python38-32\python.exe' 'c:\Users\Dami\.vscode\extensions\ms-python.python-2020.8.101144\pythonFiles\lib\python\debugpy\launcher' '58627' '--' 'c:\Users\Dami\Desktop\cheggDiscordBot.py'

DevTools listening on ws://127.0.0.1:58638/devtools/browser/837850c8-796e-44be-950f-49f667f48f0a
>>signing in!
Traceback (most recent call last):
  File "c:\Users\Dami\Desktop\cheggDiscordBot.py", line 288, in <module>
    signin()
  File "c:\Users\Dami\Desktop\cheggDiscordBot.py", line 257, in signin
    email_elem = browser.find_element_by_id('emailForSignIn')
  File "C:\Users\Dami\AppData\Roaming\Python\Python38\site-packages\selenium\webdriver\remote\webdriver.py", 
line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "C:\Users\Dami\AppData\Roaming\Python\Python38\site-packages\selenium\webdriver\remote\webdriver.py", 
line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\Dami\AppData\Roaming\Python\Python38\site-packages\selenium\webdriver\remote\webdriver.py", 
line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Dami\AppData\Roaming\Python\Python38\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="emailForSignIn"]"}
  (Session info: headless chrome=84.0.4147.125)

【问题讨论】:

  • 我不确定您的验证码处理方法是否能够导航到电子邮件/密码输入页面。因为我看不到定位器有任何问题。请检查验证码是否处理不当。

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

要将字符序列发送到电子邮件密码字段,您必须为element_to_be_clickable()诱导WebDriverWait,您可以使用以下任一Locator Strategies:

  • 使用CSS_SELECTOR

    driver.get('https://www.chegg.com/auth?action=login&redirect=https%3A%2F%2Fwww.chegg.com%2F')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#emailForSignIn"))).send_keys("alondra_calderon@ymail.com")
    driver.find_element_by_css_selector("input#passwordForSignIn").send_keys("passwordForSignIn")
    
  • 使用XPATH

    driver.get('https://www.chegg.com/auth?action=login&redirect=https%3A%2F%2Fwww.chegg.com%2F')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='emailForSignIn']"))).send_keys("alondra_calderon@ymail.com")
    driver.find_element_by_xpath("//input[@id='passwordForSignIn']").send_keys("passwordForSignIn")
    
  • 注意:您必须添加以下导入:

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

【讨论】:

    【解决方案2】:

    似乎同步问题如下错误指示-

    无法定位元素:{"method":"css 选择器","选择器":"[id="emailForSignIn"]"}

    在您的脚本中引入显式等待并更改您的代码,如下所示:

    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "emailForSignIn"))).send_keys("alondra_calderon@ymail.com")
    WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "passwordForSignIn"))).send_keys("Blueyes97")
    driver.find_element_by_name('login').click()
    

    注意:无需遍历电子邮件和密码 Selenium 自动以相同方式输入文本

    为此导入以下软件包:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多