Как я могу получить доступ к виджету разногласий внутри iFrame без ошибок? - PullRequest
1 голос
/ 22 сентября 2019

У меня проблемы с доступом к виджету (виджет диссонанса) из селена.Код иногда работает, иногда нет.Мне нужно, чтобы он был последовательным.

Это веб-сайт

Вот источник iframe, который меня беспокоит:

<iframe id="discordIframe" title="discordIframe" src="https://discordapp.com/widget?id=162891400684371968&amp;
theme=dark" width="100%" height="365" 
allowtransparency="true" frameborder="0">
#document
</iframe>

Элементы Iнужно проверить, находятся в #document, хотя я заметил, что иногда #document даже не загружается, но даже когда это происходит, моя программа все равно не может найти требуемый элемент.

ВотПример полностью воспроизводимого кода:

import selenium.webdriver as webdriver
import selenium.webdriver.common.by as by
import selenium.webdriver.support.ui as ui
import selenium.webdriver.support.expected_conditions as EC

CHROMEDRIVER_PATH = r'D:\Software\Chromedriver\chromedriver.exe'
browser = webdriver.Chrome(executable_path = CHROMEDRIVER_PATH)

std_wait = ui.WebDriverWait(browser, 10)
extended_wait = ui.WebDriverWait(browser, 30)
iframe_wait = ui.WebDriverWait(browser, 90)

print("Visiting Discord....")
browser.get(r"https://slayersclub.bethesda.net/en/#")
leaderboard = std_wait.until(EC.presence_of_element_located((by.By.CSS_SELECTOR, "div[class = 'module top-contributors']"))
                    )
browser.execute_script("arguments[0].scrollIntoView();", leaderboard)
iframes = extended_wait.until(EC.presence_of_all_elements_located((by.By.CSS_SELECTOR, "div[class = 'frame frame--padding']"))
                            )
iframes[1].click()
discordframe = iframe_wait.until(EC.presence_of_element_located((by.By.CLASS_NAME, "discordIframe"))
                                    )
browser.switch_to.frame(discordframe)
extended_wait.until(EC.presence_of_element_located((by.By.CLASS_NAME, "widgetBtnConnect-2fvtGa"))
                    ).click()

Как можно заметить, можно получить код ошибки практически во всех wait частях кода.Но тем более в части discordIframe и widgetBtnConnect-2fvtGa.Даже при том, что я ясно вижу, что все загружено, программа все еще ждет и в конечном итоге выдает ошибку.

1 Ответ

1 голос
/ 22 сентября 2019

Чтобы получить доступ к элементу в Iframe, напишите этот код:

WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"#discordIframe")))

Чтобы снова переключиться, напишите этот код

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