首页 > 解决方案 > 如何从 Selenium 中动态生成的页面中获取 HTML 元素?

问题描述

我正在尝试在 图八中登录我的帐户

使用 selenium 和 python 但我不能,因为页面中没有任何 HTML 元素,只有这些行存在。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta content="ie=edge" http-equiv="x-ua-compatible">
    <title>Figure Eight Contributor Portal</title>
    <link href="/favicon.ico" rel="shortcut icon" />
    <link href="//fonts.googleapis.com/css?family=Lato:100,300,400,700,900" rel="stylesheet" />
    <link href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" rel="stylesheet" />
  </head>
  <body>
    <div id="app">
    </div>
    <script src="/1.index.js?eca43d17e540e40a3231" type="text/javascript"></script>
    <script src="/index.js?eca43d17e540e40a3231" type="text/javascript"></script>
  </body>
</html>

令人惊讶的是,当我使用检查元素时,我可以获得 HTML 元素。在 stackoverflow 和 google 上搜索类似的主题,但找不到任何解决方案。我尝试登录的代码是:

from selenium import webdriver
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import Chrome

def sign_in(driver, url):
    driver.get(url)
    WebDriverWait(driver, 60).until(presence_of_element_located(driver.find_element_by_id('Email')))
    username = driver.find_element_by_id("Email")
    password = driver.find_element_by_id("Password")
    username.send_keys("##########")
    password.send_keys("@@@@@@@@@@")
    driver.find_element_by_name("Sign in").click()
    return True, "Success"

url = "https://contributors.figure-eight.work/login"
driver = Chrome()
result, message = sign_in(driver, url)
if result:
    print(message)

标签: pythonselenium-webdriverxpathcss-selectorswebdriverwait

解决方案


要将字符序列发送到电子邮件密码字段,您必须诱导WebDriverWait并且element_to_be_clickable()您可以使用以下任一 定位器策略

  • 使用CSS_SELECTOR

    driver.get('https://contributors.figure-eight.work/login')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='email']"))).send_keys("mohammed@awni.com")
    driver.find_element_by_css_selector("input[name='password']").send_keys("mohammed@awni.com")
    driver.find_element_by_css_selector("div.b-Login__ButtonHolder>a").click()
    
  • 使用XPATH

    driver.get('https://contributors.figure-eight.work/login')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='email']"))).send_keys("mohammed@awni.com")
    driver.find_element_by_xpath("//input[@name='password']").send_keys("mohammed@awni.com")
    driver.find_element_by_xpath("//div[@class='b-Login__ButtonHolder']/a").click()
    
  • 注意:您必须添加以下导入:

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

未来八


推荐阅读