Страница HTML добавляет элемент iframe при открытии chrome селеном в python - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в задачах селена и автоматизации веб, и я пытаюсь написать приложение для автоматизации поиска документов в PubMed с помощью chromedriver.

Моя цель - нажать в правом верхнем углу кнопку «Войти» на главной странице PubMed https://www.ncbi.nlm.nih.gov/pubmed. Таким образом, проблема заключается в следующем:

  • , когда я открываю главную страницу PubMed вручную, в источнике html нет тегов iframes, и поэтому элемент «Вход» должен быть просто доступен его xpath "//*[@id="sign_in"]".

  • , когда взамен этой же страницы открывается селен, я не могу найти этот элемент "Вход в систему" по его xpath, и если попытаться проверить его, то * Источник 1032 *, кажется, встроил его в тег <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> появился из ниоткуда, и если да, то почему.

Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2020

Вы столкнулись с проблемой из-за синхронизации. Пожалуйста, найдите ниже решение для решения вашей проблемы:

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

Вывод:

enter image description here

Проверить элемент:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...