【问题标题】:HTML page seems to add iframe element when opening chrome by selenium in python在 python 中通过 selenium 打开 chrome 时,HTML 页面似乎添加了 iframe 元素
【发布时间】:2020-07-25 00:55:02
【问题描述】:

我是 Selenium 和网络自动化任务的新手,我正在尝试使用 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 方法,否则无法再找到它。但是如果我通过Ctrl+U打开html源代码并搜索<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>元素是否真的是凭空出现的,如果是,为什么。

提前谢谢你。

【问题讨论】:

    标签: python html selenium iframe selenium-chromedriver


    【解决方案1】:

    由于同步,您遇到了问题。请找到以下解决方案来解决您的问题:

    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()
    

    输出:

    检查元素:

    【讨论】:

    • 非常感谢您的回答。我了解您的解决方案,因为您切换到正确的框架,但我仍然不明白为什么如果该元素不是在手动打开页面中,它会被嵌入到 iframe 中。
    • 如果您在手动启动ncbi.nlm.nih.gov/pubmed url 后检查您的元素,那么您将在 iframe 中了解它。并且它不是手动/自动的,登录元素总是嵌入 iframe only 。使用 selenium,我们需要在与它交互之前将控制切换到 iframe
    • 如果我启动 url 并检查我找不到任何 <iframe> 标记的元素。我怎么知道它在iframe 内?
    • 检查答案部分中的附加屏幕截图:检查元素:
    • 您是否愿意accept 回答并从您的一端点击upvote 按钮。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2022-11-27
    • 2020-10-11
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多