Как захватить элемент с помощью xapth, если этот элемент не отображается до тех пор, пока вы не используете метод .click () И этот элемент находится в части JavaScript, в чем-то, называемом BODY_BLOCK_JQUERY_REFLOW.
Я пытаюсь получить доступ к этой части HTML.
<div class = "ui_radio item" data-value = "it" data-tracker = "Italian">
<input id = "filters_detail_language_filterLang_it" type = "radio" name = "filters_detail_language_filterLang_1" value = "it" onchange = "widgetEvCall('handlers.updateFilter', event, this);">
<label for = "filters_detail_language_filterLang_it" class = "label">Italian <span class = "count">(11)</span>
</label>
</div>
Я могу получить доступ к предыдущим языкам 1-3, но когда я перехожу на 4-й язык (и другие), я не могу проанализировать xpaths, потому что он отображается как наложение.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import time
from lxml import html
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--windows-size=1080*720")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-proxy-server")
headers = {'User-Agent': ''}
proxies = {"http": ''}
chrome_driver = os.getcwd() + "/chromedriver"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver)
driver.get("https://www.tripadvisor.com/Attraction_Review-g60776-d117416-Reviews-Colorado_National_Monument-Fruita_Colorado.html")
# here we click on the more languages element
driver.find_element_by_xpath("""//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[5]""").click()
html_thing = driver.page_source
innerHTML = driver.execute_script("return document.body.innerHTML")
parser = html.fromstring(html_thing)
#T hese XPATHS work since they are part of the DOM on intial load
XPATH_LANG1 = '//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[2]/label/text()'
XPATH_LANG_COUNT1 = '//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div/div[2]/label/span//text()'
XPATH_LANG2 = '//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[3]/label/text()'
XPATH_LANG_COUNT2 = '//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div/div[3]/label/span//text()'
XPATH_LANG3 = '//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[4]/label/text()'
XPATH_LANG_COUNT3 = '//*[@id = "taplc_detail_filters_ar_responsive_0"]/div/div[1]/div/div[2]/div[4]/div/div[2]/div[1]/div[4]/label/span//text()'
# Unfortunately, these XPATHS dont work. Im assuming because they are in this JQUERY thing.
XPATH_LANG4 = """//*[@id = "BODY_BLOCK_JQUERY_REFLOW"]/div[12]/div[2]/div/div[5]/label/text()"""
print(XPATH_LANG4, 'this is lang 4')
raw_lang1 = parser.xpath(XPATH_LANG1)
print(raw_lang1)
raw_lang_count1 = parser.xpath(XPATH_LANG_COUNT1)
print(raw_lang_count1)
raw_lang2 = parser.xpath(XPATH_LANG2)
print(raw_lang2)
raw_lang_count2 = parser.xpath(XPATH_LANG_COUNT2)
print(raw_lang_count2)
raw_lang3 = parser.xpath(XPATH_LANG3)
print(raw_lang3)
raw_lang_count3 = parser.xpath(XPATH_LANG_COUNT3)
print(raw_lang_count3)
raw_lang4 = parser.xpath(XPATH_LANG4)
if not raw_lang4:
print(raw_lang4, '<--------------- THIS IS EMPTY')
else:
print(raw_lang4, 'It actually showed up')
driver.close()
driver.quit()
Я пробовал использовать `driver.find_element_by_xpath (" "" "" "), я пробовал парсеры и все остальное, что я мог придумать.
Проблема, похоже, в том, что хотя язык, в данном случае «итальянский» (4-й язык в оверлее), находится в исходном коде страницы, XPATH его не видит. Это проблема, потому что страница использует динамические идентификаторы или вообще не использует их.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте нажать кнопку «Другие языки» и подождите, пока в модальном окне не появятся требуемые параметры:
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait
driver.get('https://www.tripadvisor.com/Attraction_Review-g60776-d117416-Reviews-Colorado_National_Monument-Fruita_Colorado.html')
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//span[. = "More languages"]'))).click()
languages = [lang.text for lang in wait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, '//div[@class = "more-options"]//label')))][1:]
print(languages)
['English (1,463)', 'German (34)', 'French (24)', 'Italian (11)', 'Dutch (9)', 'Chinese (Sim.) (8)', 'Danish (5)', 'Portuguese (4)', 'Spanish (4)', 'Japanese (2)', 'Russian (2)', 'Polish (1)']
Просматривая ваш ответ, @Andersson, он очень краток, мне нравится ваш подход. Мне есть чему поучиться из этого комментария.
Вы не представляете, как долго я это делал.