python - 如何从 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)
解决方案
要将字符序列发送到电子邮件和密码字段,您必须诱导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
浏览器快照:
推荐阅读
- javascript - 如何在 React 中添加带有嵌套集合的新 Firestore 文档?
- java - 在 Airflow 中找不到 Java 命令
- node.js - 如何解决 NodeJS 控制器不工作
- typescript - 在 TypeScript 中使用可选属性扩展泛型类型
- tableau-api - 如何在tableau中显示上一季度的数据
- android - 如何在 statelessWidget 类中使用 setState() 函数
- typescript - Webpack 没有因 TypeScript 错误而失败
- android - Android - 使用 retrofit2 请求动态 IP 地址
- laravel - 如何在 laravel 中使用从中间件解析到控制器的构造函数?
- c# - Visual Studio 2019 DirectX 使用指令