Как ждать загрузки страницы iframe в Selenium? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть страница, включающая теги iframe, и я хочу ее поймать, если содержимое полностью загружено в iframe.

Я использую time.sleep с проверкой document.readyState, и она отлично работает в идеальных случаях;сильный и быстрый ответ от веб-сервера.Но, похоже, это не гарантирует все ситуации, и я хочу улучшить свой код.

Пожалуйста, скажите мне знать некоторые советы или советы.Спасибо.

Мои envs

  • os: windows 7 x64
  • хром: 68.0.3440.106 (официальный, 64 бит)
  • python: 3.6.6
  • селен: 3.14.0

Я ссылаюсь на следующие документы.

и я написал код ниже

def wait_for_document(self, driver):
    time.sleep(3)
    for i in range(20):
        if driver.execute_script("return document.readyState") == "complete" : return
        else : time.sleep(1)

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018
you could use this method to  wait for page to fully load:-

public  boolean waitForJStoLoad() {

        WebDriverWait wait = new WebDriverWait(driver, 50);

        JavascriptExecutor js = (JavascriptExecutor) driver;

        ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver driver) {
                try {
                    return ((Long)js.executeScript("return jQuery.active") == 0);
                }
                catch (Exception e) {
                    return true;
                }
            }
        };

        // wait for Javascript to load
        ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver driver) {
                return js.executeScript("return document.readyState")
                        .toString().equals("complete");
            }
        };

        return wait.until(jQueryLoad) && wait.until(jsLoad);
    }
0 голосов
/ 14 сентября 2018

Попробуйте следующий код, чтобы дождаться iframe и переключиться на него, чтобы иметь возможность обрабатывать внутренние узлы:

from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.common.by import By

driver = webdriver.Chrome() 
driver.get(URL) 
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("iframe_name_or_id"))

Вместо "iframe_name_or_id" вы можете передать iframe как WebElement:

wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_xpath('//iframe')))

Для ожидания присутствия элемента внутри фрейма:

wait(driver, 10).until(EC.presence_of_element_located((By.ID, "Element ID")))

Вы также можете использовать By.NAME, By.CLASS_NAME, By.XPATH и т. Д. *

Подробнее о ExplicitWait

0 голосов
/ 14 сентября 2018

Вам необходимо изменить исполнение селен на iframe и проверить загруженный URL после этого.

Пример:

$frame = $selenium->findElement(WebDriverBy::id('iframe'));
$selenium->switchTo()->frame($frame);

if (strstr($selenium->getCurrentURL(), "my_url") !== FALSE) {
  do stuff...
}
0 голосов
/ 14 сентября 2018
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

browser = webdriver.Chrome('/path/to/driver')
browser.get('http://your/url')
try:
    myElem = WebDriverWait(browser, delay).until(expected_conditions.presence_of_element_located((By.ID, 'id of iframe or whatever')))
except TimeoutException:
    # error

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