Как заставить работать переключение iframe в python/selenium?

Я пытался получить данные из следующего связь:

Я могу идентифицировать несколько кадров:

SCROLL_PAUSE_TIME = 2
CYCLES=2
browser = webdriver.Firefox(firefox_options=opt)
browser.get(pge)
sleep(1)
comment_button = browser.find_elements_by_class_name('Ob2kfd') 
sleep(1)
comment_button[0].click() 
sleep(1)
html = browser.find_element_by_tag_name('html')
frames = browser.find_elements_by_tag_name('iframe')

это находит кадры:

[<selenium.webdriver.remote.webelement.WebElement 
(session = "bbe62090fb83ba8774d855278b17b007", element = "0.46172414237768167- 
3")>,
 <selenium.webdriver.remote.webelement.WebElement 
(session = "bbe62090fb83ba8774d855278b17b007", element = "0.46172414237768167- 
4")>,
 <selenium.webdriver.remote.webelement.WebElement 
 (session = "bbe62090fb83ba8774d855278b17b007", 
 element = "0.46172414237768167-5")>,
 <selenium.webdriver.remote.webelement.WebElement 
 (session = "bbe62090fb83ba8774d855278b17b007", 
 element = "0.46172414237768167-6")>,
  <selenium.webdriver.remote.webelement.WebElement 
 (session = "bbe62090fb83ba8774d855278b17b007", 
 element = "0.46172414237768167-7")>,
 <selenium.webdriver.remote.webelement.WebElement 
 (session = "bbe62090fb83ba8774d855278b17b007", 
 element = "0.46172414237768167-8")>]

Теперь та часть, которая не работает... Я не могу переключиться на рамку с обзорами, я пробовал много подходов:

browser.switch_to.frame(browser.find_element_by_tag_name("iframe"))

WebDriverWait(browser,10).until(EC.frame_to_be_available_and_switch_to_it((browser.find_element_by_tag_name("iframe"))))

WebDriverWait(browser, 20).until(EC.element_to_be_clickable((browser.find_element_by_tag_name("iframe"))))

browser.switch_to.default_content()

browser.switch_to.parent_frame()

browser.switch_to.frame(frames[0])

browser.switch_to.frame(frames[1])

#etc

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

browser.switch_to.frame("gci_91f30755d6a6b787dcc2a4062e6e9824.js")

Я хочу в основном прокрутить обзоры, но, похоже, я застрял не в том кадре:

sleep(2)
for i in range(CYCLES):
    html.send_keys(Keys.DOWN)
    time.sleep(SCROLL_PAUSE_TIME)

а ничего не работает?

Обратите внимание, что это не дубликат, я ценю, что есть несколько других сообщений с похожими проблемами, но я действительно пробовал каждый упомянутый подход, и, похоже, ничего не работает! Если кто-то может помочь, это было бы очень признательно. Если вы можете попробовать по ссылке на страницу, похоже, она не работает.

Вы упомянули о невозможно переключиться на кадр, который имеет обзоры. Вы пытаетесь очистить тексты отзывов, например, "Отличный сервис, даже на английском!", «Очень хороший опыт, личные супер профессиональные и добрые.» и т. д.?

undetected Selenium 17.04.2019 10:55

да, я хочу очистить каждый комментарий

tezzaaa 17.04.2019 11:02

Обновите вопрос, что именно вы подразумеваете под ...каждый комментарий...

undetected Selenium 17.04.2019 11:03

К сожалению, я не могу отредактировать вопрос...

tezzaaa 17.04.2019 11:07

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

tezzaaa 17.04.2019 11:09

Вы до сих пор не сказали нам, какие и сколько комментариев вы имеете в виду под ...каждый комментарий..., иначе ваш вопрос выглядит как Слишком широкий

undetected Selenium 17.04.2019 11:11

все 127 комментариев на этой странице, но мой вопрос не о том, как очистить комментарии, а переключиться на правильный iframe, содержащий комментарии.

tezzaaa 17.04.2019 11:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
230
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Элемент не находится внутри какого-либо iframe. Попробуйте использовать webdriverwait и селектор css. Здесь я пробовал с хромом и отлично работает. Печатая мне текст 127 Google reviews, это то, что вам нужно.

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

driver=webdriver.Chrome()
driver.get("https://www.google.com/search?rlz=1C1GCEU_en__835__835&ei=gfW0XKjNFeXjkgW8g6PYDA&q=huawei%20stores%20italy&oq=huawei+stores+italy&gs_l=psy-ab.3..0i22i30l3.4596.6067..6522...1.0..0.99.530.7......0....1..gws-wiz.......0i71j0i20i263j0i67j0j33i160.QYVpoia0BL4&npsic=0&rflfq=1&rlha=0&rllag=45499827,9211657,4837&tbm=lcl&rldimm=17275164572016510107&lqi=ChNodWF3ZWkgc3RvcmVzIGl0YWx5IgOIAQFaDwoNaHVhd2VpIHN0b3Jlcw&ved=2ahUKEwiKrMm8g9PhAhXQ4KQKHY9KDc8QvS4wAXoECAoQHQ&rldoc=1&tbs=lrf:!2m1!1e3!2m1!1e16!3sIAE,lf:1,lf_ui:4#rlfi=hd:;si:17275164572016510107,l,ChNodWF3ZWkgc3RvcmVzIGl0YWx5IgOIAQFaDwoNaHVhd2VpIHN0b3Jlcw;mv:!1m2!1d45.5258666!2d9.274078399999999!2m2!1d45.443338999999995!2d9.1152195;tbs:lrf:!2m1!1e3!2m1!1e16!3sIAE,lf:1,lf_ui:4")
element=WebDriverWait(driver,20).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR,'span.fl span a span')))
print(element.text)

elements=WebDriverWait(driver,20).until(expected_conditions.presence_of_all_elements_located((By.CSS_SELECTOR,'div.Jtu6Td span')))

for ele in elements:
    print(ele.text)

Будет напечатан первый отпечаток

127 Google reviews

Второй цикл напечатает 3 комментария обзора, чтобы увидеть больше комментариев, на которые вы должны нажать More Google review. Я думаю, что в этой части вы сделаете это.

Very good experience, personal are super professional and kind. I became now huawei client :)
The team is  really kind and extremely prepared
Good store everything you want from Huawei.

ОТРЕДАКТИРОВАНО:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException


driver=webdriver.Chrome()
driver.get("https://www.google.com/search?rlz=1C1GCEU_en__835__835&ei=gfW0XKjNFeXjkgW8g6PYDA&q=huawei%20stores%20italy&oq=huawei+stores+italy&gs_l=psy-ab.3..0i22i30l3.4596.6067..6522...1.0..0.99.530.7......0....1..gws-wiz.......0i71j0i20i263j0i67j0j33i160.QYVpoia0BL4&npsic=0&rflfq=1&rlha=0&rllag=45499827,9211657,4837&tbm=lcl&rldimm=17275164572016510107&lqi=ChNodWF3ZWkgc3RvcmVzIGl0YWx5IgOIAQFaDwoNaHVhd2VpIHN0b3Jlcw&ved=2ahUKEwiKrMm8g9PhAhXQ4KQKHY9KDc8QvS4wAXoECAoQHQ&rldoc=1&tbs=lrf:!2m1!1e3!2m1!1e16!3sIAE,lf:1,lf_ui:4#rlfi=hd:;si:17275164572016510107,l,ChNodWF3ZWkgc3RvcmVzIGl0YWx5IgOIAQFaDwoNaHVhd2VpIHN0b3Jlcw;mv:!1m2!1d45.5258666!2d9.274078399999999!2m2!1d45.443338999999995!2d9.1152195;tbs:lrf:!2m1!1e3!2m1!1e16!3sIAE,lf:1,lf_ui:4")
element=WebDriverWait(driver,20).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR,'span.fl span a span')))
print(element.text)
no_of_review=int(element.text.split()[0])
print(no_of_review)

elemore=WebDriverWait(driver,20).until(expected_conditions.element_to_be_clickable((By.XPATH,'//span[text() = "More Google reviews"]')))
driver.execute_script("arguments[0].click();",elemore)

all_reviews = WebDriverWait(driver, 3).until(expected_conditions.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.gws-localreviews__google-review')))

while len(all_reviews) < no_of_review:
    driver.execute_script('arguments[0].scrollIntoView(true);', all_reviews[-1])
    WebDriverWait(driver, 1).until_not(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, 'div[class$ = "activityIndicator"]')))
    all_reviews = driver.find_elements_by_css_selector('div.gws-localreviews__google-review')

reviews = []
for review in all_reviews:
    try:
         full_text_element = review.find_element_by_css_selector('span.review-full-text')
         reviews.append(full_text_element)
    except NoSuchElementException:
        full_text_element = review.find_element_by_css_selector('span[class^ = "r-"]')
        reviews.append(full_text_element.get_attribute('textContent'))

print(reviews)

Привет, спасибо за вашу помощь. Я пытаюсь нажать на кнопку, но она не работает: comment_button = browser.find_elements_by_class_name('xwP61c') comment_button[0].click(), но ничего не происходит

tezzaaa 17.04.2019 12:30

попробуйте следующий код, чтобы нажать кнопку «Дополнительно». elemore=WebDriverWait(driver,20).until(expected_conditions.e‌​lement_to_be_clickab‌​le((By.XPATH,'//span‌​[text() = "More Google reviews"]'))) driver.execute_script("arguments[0].click();",elemore)

KunduK 17.04.2019 12:51

Другие вопросы по теме