Выполнение скриптов страницы перед извлечением их содержимого - PullRequest
0 голосов
/ 23 июня 2019

У меня есть страница, на которой мне нужно автоматизировать некоторые задачи и удалить некоторые данные, но страница загружает JS после загрузки, чтобы вставить некоторые данные в DOM; что я не могу перехватить (во всяком случае, не в хорошем формате), я надеялся найти решение, которое было бы быстрым и не занимало бы память.

Я сам пытался получить сценарии и выполнить их с помощью какого-либо безголового драйвера (а именно, phantomJs), но он не обновил источник страницы, и я не уверен, как извлечь обновленный DOM из этого

var page = GetWebPage(url);
var scripts = page.Html.QuerySelectorAll("script");

var phantomDriver = new PhantomJSDriver(PhantomJSDriverService.CreateDefaultService(Directory.GetCurrentDirectory()));
phantomDriver.Navigate().GoToUrl(url);

foreach (var script in scripts)
    phantomDriver.ExecuteScript(script.InnerText);

var at = phantomDriver.PageSource;

1 Ответ

0 голосов
/ 23 июня 2019

Вы можете использовать «ждать». Согласно этой ссылке , Selenium имеет неявные и явные ожидания. В приведенном ниже примере используется явное ожидание.

Чтобы использовать явное ожидание, используйте WebDriverWait и ExpectedConditions. Я не уверен, какой язык вы используете, но вот пример на Python. При этом в блоке try-catch используется WebDriverWait, что позволяет timeout секундам соответствовать указанному ExpectedConditions. По состоянию на июнь 2019 года условия доступны в:

Пример кода на python:

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

url = '/9308189/vypolnenie-skriptov-stranitsy-pered-izvlecheniem-ih-soderzhimogo'
target = (By.XPATH, "//div[@class='gravatar-wrapper-32']")
timeout = 20  # Allow max 20 seconds to find the target

browser = webdriver.Chrome()
browser.get(url)
try:
    WebDriverWait(browser, timeout).until(EC.visibility_of_element_located(target))
except TimeoutException:
    print("Timed out waiting for page to load")
    browser.quit()

Важный бит находится между try и except, который вы должны изменить, чтобы использовать конкретное «ожидаемое условие», которое вас интересует.

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