Как сделать цикл с click () в селене? - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу нажать на профиль группы каждого участника на Facebook, но я получаю сообщение об ошибке в цикле.

Вот мой код:

def open(link):
    try:
        driver.get(link)
    except:
        print('no internet access')

def OpenProfileMember():
    open('https://mbasic.facebook.com/browse/group/members/?id=1600319190185424')
    find = driver.find_elements_by_class_name('bn')
    for x in find:
        if x != find[0]:
            x.click()
            time.sleep(3)
            driver.back()
        else:
            continue
OpenProfileMember()

Это сообщение об ошибке, которое яполучить:

PS C:\Users\LENOVO> & C:/Python27/python.exe "c:/Users/LENOVO/OneDrive/Documents/project/python/Selenium/robot olshop.py" Traceback (most recent call last):   File "c:/Users/LENOVO/OneDrive/Documents/project/python/Selenium/robot olshop.py", line 77, in <module>
    OpenProfileMember()   File "c:/Users/LENOVO/OneDrive/Documents/project/python/Selenium/robot olshop.py", line 70, in OpenProfileMember
    x.click()   File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)   File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)   File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)   File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace) selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <a class="bn" href="/rxrzimam?fref=gm"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

1 Ответ

1 голос
/ 06 ноября 2019

Вы получаете StaleElementReferenceException, что означает, что элемент, на который вы пытаетесь щелкнуть, либо больше не присутствует на странице, либо его контекст каким-то образом изменился, и ваша ссылка в списке на этот конкретный элемент больше не действительна.

Вы можете исправить это, переместив список find. После того, как вы позвоните x.click(), все элементы в find устареют, потому что вы даже больше не находитесь на этой странице. Когда вы нажимаете back, элементы на странице отличаются от тех, которые были до того, как вы нажали.

def OpenProfileMember():
    open('https://mbasic.facebook.com/browse/group/members/?id=1600319190185424')

    # get number of elements to click on
    find_length = len(driver.find_elements_by_class_name('bn'))

    # declare a counter to track the loop and keep track of which element in the list to click
    list_count = 0

    # loop through elements and click the element at [list_count] index
    while (list_count < find_length)

        # get the elements
        find = driver.find_elements_by_class_name('bn')

        # click the current indexed element
        find[list_count].click()

        # go back
        time.sleep(3)
        driver.back()

Важно, чтобы каждая итерация цикла while обновляла переменную find, вызываяdriver.find_elements. Если вы найдете элементы до входа в цикл, а затем выполните действия click() и back(), вы последовательно столкнетесь с исключением StaleElement.

Я не уверен, что if x != find[0]: должен проверятьза. В противном случае вы звоните continue - этот цикл будет щелкать только первый элемент в списке из того, что я могу сказать. Это ваше намерение, или вы хотите нажать на все элементы?

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