Python Selenium (ожидание поиска кадров, элементов) - PullRequest
4 голосов
/ 22 марта 2012

У меня есть такие:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

Настройка браузера через

browser = webdriver.Firefox() 
browser.get(loginURL) 

Однако иногда я делаю

browser.switch_to_frame("nameofframe")

И это не сработает (иногда работает, иногда нет).

Я не уверен, так ли это, потому что Selenium на самом деле не ожидает загрузки страниц перед тем, как выполнить остальную часть кода или что-то еще. Есть ли способ принудительной загрузки веб-страницы?

Потому что иногда я делаю что-то вроде

browser.find_element_by_name("txtPassword").send_keys(password + Keys.RETURN)
#sends login information, goes to next page and clicks on Relevant Link Text
browser.find_element_by_partial_link_text("Relevant Link Text").click()

И большую часть времени он будет отлично работать, но иногда я получаю сообщение об ошибке, когда не может найти «Соответствующий текст ссылки», потому что он не может «увидеть» его или что-то подобное.

Кроме того, есть ли лучший способ проверить, существует элемент или нет? То есть, как лучше всего обращаться:

browser.find_element_by_id("something")

Когда этот элемент может существовать или не существовать?

1 Ответ

9 голосов
/ 26 марта 2012

Вы можете использовать WebDriverWait:

from contextlib import closing
from selenium.webdriver import Chrome as Browser
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchFrameException


def frame_available_cb(frame_reference):
    """Return a callback that checks whether the frame is available."""
    def callback(browser):
        try:
            browser.switch_to_frame(frame_reference)
        except NoSuchFrameException:
            return False
        else:
            return True
    return callback

with closing(Browser()) as browser:
    browser.get(url)
    # wait for frame
    WebDriverWait(browser, timeout=10).until(frame_available_cb("frame name"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...