2015-09-07 3 views
0

Что я должен делать, это пытаться перебрать все , чтобы выбрать значения и получить некоторые данные. Данные загружаются через AJAX, поэтому страница не перезагружается - данные в таблице просто меняются. Как вы можете видеть, я попытался использовать явное ожидание, но это не работает - значение select может быть «4», но информация в таблице все еще может принадлежать значению «3». Я хотел бы знать, как я могу быть уверен, что страница действительно обновлена?Как определить, полностью ли загружена страница в Selenium?

Есть несколько похожих вопросов, но я не нашел правильного решения.

for i in range(N): 
    try: 
     driver.find_element_by_xpath("//select[@id='search-type']/option[@value='%s']"%i).click() 
     driver.find_element_by_name("submit").click() 
    except: 
     print i 
     continue 
    elem = driver.find_element_by_id("my_id") 
    wait.until(lambda driver: driver.find_element_by_id('search-type').get_attribute("value")==str(i)) 
    if no_results(get_bs_source(driver.page_source)): 
     print "No results %s"%i 
    if is_limited(get_bs_source(driver.page_source)): 
     print "LIMITED %s"%i 
    data+=get_links_from_current_page(driver) 

Конечно, я могу использовать time.sleep (N), но это не так, как я хотел бы сделать это.

+0

Что вызывает обновление страницы? Это клик или? Как только вы это выясните, найдите способ обнаружить изменения? Есть ли где-то сообщение, в котором говорится, что обновление сделано, есть ли изменение цвета и т. Д.? – JeffC

+0

Можете ли вы объяснить, что страница действительно обновлена? Что это значит ** для вашего приложения **? Как вы можете сказать? – SiKing

+0

@SiKing после нажатия браузера на какую-либо кнопку - данные страницы в таблице обновляются. Я вижу это, потому что изменения данных. Я думал, что есть способы проверить, есть ли какая-то сетевая активность или что-то в этом роде. –

ответ

-1
var javaScriptExecutor = Instance as IJavaScriptExecutor; 

bool isPageLoaded = javaScriptExecutor.ExecuteScript("return document.readyState;").Equals("complete"); 
+0

Вы не должны этого делать, поскольку это уже реализовано в webdriver. https://github.com/SeleniumHQ/selenium/blob/01399fffecd5a20af6f31aed6cb0043c9c5cde65/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPageToLoad.java#L59-L73 – stanjer

0

Селен использует document.ready состояние, чтобы определить, если страница была загружена или нет. WebDriverWait реализация такого рода логики. Вы не должны использовать document.readyState прямо! В большинстве функций он ждет, например:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 

browser = webdriver.Firefox() 
browser.get("http://something.com") 
delay = 10 # seconds 

WebDriverWait(browser, delay).until(EC.presence_of_element_located(browser.find_element_by_id('IdOfMyElement'))) 

В этом случае он будет выполнять document.ready 2 раза: первый время browser.get, второй раз во время WebDriverWait.

Selenium implementation: https://github.com/SeleniumHQ/selenium/blob/01399fffecd5a20af6f31aed6cb0043c9c5cde65/java/client/src/com/thoughtworks/selenium/webdriven/commands/WaitForPageToLoad.java#L59-L73

+0

стоит упомянуть исходный источник этого ответа: http://stackoverflow.com/questions/26566799/selenium-python-how-to-wait-until-the-page-is-loaded –

+0

Очевидно, что всего лишь половина, если он, поскольку я взял первый код, который я нашел для описания это (исходный код сам по себе довольно бесполезен) – stanjer

Смежные вопросы