Невозможно циклически нажимать на ссылки с веб-страницы - PullRequest
0 голосов
/ 28 апреля 2018

Я написал скрипт на python в сочетании с селеном, чтобы циклически нажимать на несколько ссылок с веб-страницы. Прежде всего, скребок должен нажать на кнопку поиска (без каких-либо изменений в полях поиска) на целевой странице, чтобы заполнить результаты.

ШАГ ПЕРВЫЙ:

Когда результаты появятся, скребок должен щелкнуть по каждой из ссылок, которые я пытался показать на первом изображении. После нажатия на любую ссылку появляется окно с дополнительной информацией.

ШАГ ВТОРОЙ:

Во всплывающем окне есть несколько вкладок, скрывающих немного больше информации, которая открывается при нажатии (новые вкладки видны на изображении 3).

НАКОНЕЦ:

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

То, что я попробовал, может почти все сделать. Он выполняет все вышеуказанные шаги один раз (для первой ссылки), но для второй ссылки скребок застревает в последней строке моего скрипта, выдавая ошибку timeout exception. Буду очень признателен за любую помощь, чтобы сделать это.

Адрес сайта: ссылка на сайт

Это то, что я пробовал до сих пор:

from selenium import webdriver ; import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get("https://www.mspa-ea.org/search-mspa-companies.html")

wait.until(EC.element_to_be_clickable((By.ID, "element-button"))).click() #clicking on search button
for post in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".company a"))):
    post.click() #clicking on each links shown in image one
    time.sleep(2)
    try:
        for elem in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li"))):
            elem.click() #clicking on tabs cyclically
            time.sleep(2)
    except:
        pass
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".memberDetail .closeDetail"))).click()
    #close the pop up box.
    #timeout exception throws here when it cycles for the second time

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

Изображения следующие (один, два и три по порядку):

https://i.stack.imgur.com/RLvVY.jpg

https://i.stack.imgur.com/OK2R4.jpg

https://i.stack.imgur.com/o7pG5.jpg

1 Ответ

0 голосов
/ 28 апреля 2018

Когда я запускаю ваш код, вместо того, чтобы получить исключение при вызове click, я получаю исключение в следующей строке:

for elem in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".memberDetail .informationContainer ul li"))):

Эта строка не делает то, что вы хотите, чтобы она работала - этот селектор возвратит все элементов <li> на странице (около 5000 из них), а не только содержится в сообщении, которое вы открыли.

Поскольку большинство этих <li> элементов не видны (поскольку всплывающие окна, содержащие их, закрыты), ваш вызов visibility_of_all_elements_located истекает.

Вам необходимо заменить вышеприведенную строку кода на строку, которая возвращает только элементы табуляции <li>, которые являются потомками post WebElement, который открыт в данный момент.

...