python - 在 python 中通过 selenium 打开 chrome 时,HTML 页面似乎添加了 iframe 元素
问题描述
我是 selenium 和 web 自动化任务的新手,我正在尝试使用 chromedriver 编写一个用于在 PubMed 上自动搜索论文的应用程序。
我的目标是单击 PubMed 主页https://www.ncbi.nlm.nih.gov/pubmed右上角的“登录”按钮。所以问题是:
当我手动打开 PubMed 主页时,html 源代码中没有 iframes 标签,因此“登录”元素应该可以通过其 xpath 轻松访问
"//*[@id="sign_in"]"
。当由 selenium 打开同一页面时,我无法通过其 xpath 找到“登录”元素,如果尝试检查它,则 html 源似乎已将其嵌入
<iframe>
标签中,因此无法再找到它,除非一个driver._switch_to.frame
方法被执行。但是如果我打开html源代码Ctrl+U
并搜索<iframe>
元素,仍然没有。这是“登录”元素检查捕获:
["Sign in" inspection][1]
我已经通过以下方式解决了这个问题:
bot = PubMedBot()
bot.driver.get('https://www.ncbi.nlm.nih.gov/pubmed')
sleep(2)
frames = bot.driver.find_elements_by_tag_name('iframe')
bot.driver._switch_to.frame(frames[0])
btn = bot.driver.find_element_by_xpath('/html/body/a')
btn.click()
但我只想了解为什么检查代码与 html 源代码不同,这个<iframe>
元素是否真的是凭空出现的,如果是,为什么。
先感谢您。
解决方案
您因同步而面临问题。请找到以下解决方案来解决您的问题:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r"path ofchromedriver.exe")
driver.maximize_window()
wait = WebDriverWait(driver, 10)
driver.get("https://www.ncbi.nlm.nih.gov/pubmed")
iframe = wait.until(EC.presence_of_element_located((By.TAG_NAME, "iframe")))
driver.switch_to.frame(iframe)
wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Sign in to NCBI')]"))).click()
输出:
检查元素:
推荐阅读
- nginx - Nginx infinite redirect using try_files
- javascript - How do I turn string insert data into a series for react highcharts?
- python - 运行时范围和`main`符号在函数内部或外部是不同的
- mongodb - docker容器内的mongodb身份验证
- xcode - Ionic Unexpected key "NSMainNibFile~ipad" while parsing
- reinforcement-learning - Why Q-Learning is Off-Policy Learning?
- angular - mat-slider 动态背景颜色
- python - pytorch vgg 对一张图像进行模型测试
- android - 检查输入是否为空不起作用 Kotlin
- python - batch file to convert .mp4 to .mp3 crashes half the times