Selenium, в html не вижу элемент, хотя в броузере selenium его видно
Не могу никак решить. Захожу на страничку с помощью Selenium и сохраняю полученный html в файл, при этом не вижу там один из элементов, хотя в окне браузера, в котором отображается происходящее, этот элемент видно, и даже успеваю по нему щелкнуть, при установленном большом ожидании.
Ниже адрес страницы, на которой осуществляется поиск. Нужно пролистать до раздела "информация о заказчике" и наименование заказчика является ссылкой. Нужна она. (Причем, часть подобных запросов нормально обрабатывается, а часть ломается.)
url_customer = 'http://zakupki.gov.ru/pgz/public/action/contracts/info/common_info/show?source=epz&contractInfoId=3076209'
driver = webdriver.Chrome()
Ожидание побольше поставил, чтобы наглядно было
wait = WebDriverWait(driver, 20)
Попытка пролистать до конца страницы, тоже не помогает:
driver.find_element(By.TAG_NAME,'body').send_keys(Keys.END)
Попытка подождать пока загрузится футер(была мысль, что он же в самом конце)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "footer.footer")))
Мои попытки подождать загрузку желаемого элемента
t_xpath = "//div[@id='ajax-group']/span[@class='section__info/a']"
wait.until(EC.presence_of_element_located((By.XPATH, t_xpath)))
Записываю в файл то, что загрузилось и вижу , что там нет нужной ссылки
html = driver.page_source
with open('customer.html', 'w') as file:
file.write(html)
В записанном файле нужное место выглядит вот так, без нужного тэга
<div class="container">
<div class="row blockInfo">
<div class="col">
<h2 class="blockInfo__title">Информация об изменении контракта</h2>
<div class="blockInfo__section">
<section class="blockInfo__section section">
<span class="section__title">Причина изменения условий контракта</span>
<span class="section__info"></span>
</section>
Работающий код полностью:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
url_customer = 'http://zakupki.gov.ru/pgz/public/action/contracts/info/common_info/show?source=epz&contractInfoId=3076209'
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
try:
driver.get(url_customer)
t_xpath = "//div[@id='ajax-group']/span[@class='section__info/a']"
driver.find_element(By.TAG_NAME,'body').send_keys(Keys.END)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "footer.footer")))
wait.until(EC.presence_of_element_located((By.XPATH, t_xpath)))
except Exception as ex:
print(f'Error: {ex}')
html = driver.page_source
with open('customer.html', 'w') as file:
file.write(html)
Ответы (1 шт):
Ваш XPATH на странице у меня ничего не нашел. Зацепился за "Полное наименование заказчика"
(By.XPATH, "//*[.='Полное наименование заказчика']/../span/a").click()
Чтобы не пролистывать страницу, следует указать в options странице размер, для пользователя ничего не видно, а селениум видит всё.
driver.set_window_size(1400, 3000)
Ещё при клике по ссылке, обнаружил открытия нового окна, чтобы в нем работать нужно на него переключиться, или все элементы которые Вы введете, он не найдет так как он работает на нулевом окне. Делается это следующим образом:
driver.switch_to.window(driver.window_handles[1])
Где 1 - это номер вкладки, самая первая - 0, вторая 1 и т.д.
Следовательно нужно перейти на вторую вкладку [1], и пробуйте Ваш код.
html = driver.page_source
with open('customer.html', 'w') as file:
file.write(html)