Python & Selenium: код не выполняется во время исключения Selenium - PullRequest
0 голосов
/ 28 марта 2019

У меня есть сценарий Python, который запускает веб-драйвер selenium, который выполняется в следующие шаги:

1) Выполнить цикл for, который выполняется x раз 2) В основном цикле for веб-драйвер селена находит кнопки на странице, используя xpath. 3) Для каждой кнопки, найденной селеном, вложенные циклы нажимают каждую кнопку 4) После нажатия кнопки открывается всплывающее окно, которое перенаправляет случайные веб-сайты во всплывающем окне. 5) Далее, селеновый веб-драйвер находит другие кнопки во всплывающем окне и нажимает кнопку, закрывает всплывающее окно и возвращается в главное окно, чтобы нажать вторую кнопку на главном веб-сайте

Этот код отлично работает во время выполнения, но проблема возникает, когда возникают исключения селена.

1) Если во всплывающем окне есть пустая страница, возникает исключение селена, но код, написанный для этого исключения, не выполняется 2) Если всплывающее окно закрывается основным веб-сайтом по истечении времени ожидания (не закрывается веб-драйвером selenium), возникает NoSuchWindowException, но при этом исключении никогда не выполняется

Я пытался несколько раз изменить код, добавив условие if else, но не смог разрешить исключение NoSuchWindowException exceptio

Ниже приведен код:

for _ in range(100):
    print("main loop pass")

    fb_buttons = driver.find_elements_by_xpath('//a[contains(@class,"pages_button profile_view")]')

    for button in fb_buttons:
        try:
            time.sleep(10)
            button.click()
            driver.implicitly_wait(5)
            driver.switch_to.window(driver.window_handles[1])
            driver.execute_script("window.scrollTo(0, 2500)")
            print("wiindow scrolled")

            like_right = driver.find_elements_by_xpath(
                "/html[1]/body[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[1]/div[2]/div[2]/div[1]/div[1]/div[3]/div[1]/div[1]")
            like_left = driver.find_elements_by_xpath(
                "/html/body/div[1]/div/div[2]/div/div[1]/div[1]/div[2]/div/div[2]/table/tbody/tr/td[1]/a[1]")

            while like_right:
                for right in like_right:
                    right.click()
                break
            while like_left:
                for left in like_left:
                    left.click()
                break
            while like_post:
                for like in like_post:
                    like.click()
                break
            time.sleep(5)
            driver.close()
            driver.implicitly_wait(5)
            driver.switch_to.window(driver.window_handles[0])
            print("clicks executed successfully")
            continue

        except StaleElementReferenceException as e:


            driver.close()
            driver.switch_to.window(driver.window_handles[0])
            popunder = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[3]/p[2]/a")
            if popunder is True:
                popunder.click()
                driver.implicitly_wait(5)
            else:
                continue
            print("exception occured-element is not attached to the page document")

        except ElementNotVisibleException as e:

            driver.close()
            driver.switch_to.window(driver.window_handles[0])
            popunder = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[3]/p[2]/a")
            if popunder is True:
                popunder.click()
                driver.implicitly_wait(5)
            else:
                continue
            print("Exception occured - ElementNotVisibleException")

        except WebDriverException as e:

            driver.close()
            driver.switch_to.window(driver.window_handles[0])
            popunder = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[3]/p[2]/a")
            if popunder is True:
                popunder.click()
                driver.implicitly_wait(5)
            else:
                continue
            print("Exception occured - WebDriverException")

        except NoSuchWindowException as e:
            driver.switch_to.window(driver.window_handles[0])
            popunder = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[3]/p[2]/a")
            if popunder is True:
                popunder.click()
                driver.implicitly_wait(5)
            else:
                continue
            print("Exception - NoSuchWindowException - Switched to main window")

    else:
        time.sleep(5)
        refresh.click()
        print("refreshed")

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

File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchWindowException: Message: no such window: target window already closed
from unknown error: web view not found
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 6.1.7601 SP1 x86_64)


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/javed/PycharmProjects/clicks/test/fb-click-perfect-working.py", line 98, in <module>
    driver.close()
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 688, in close
    self.execute(Command.CLOSE)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchWindowException: Message: no such window: target window already closed
from unknown error: web view not found
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 6.1.7601 SP1 x86_64)


Process finished with exit code 1

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Я бы обязательно переключился на закрывающее окно, прежде чем driver.close ().

driver.switch_to.window(driver.window_handles[1]) 
driver.close() 
driver.switch_to.window(driver.window_handles[0])
0 голосов
/ 28 марта 2019

Две вещи:

1) В except, который вы используете driver.close(), вы пытаетесь использовать уже закрытое driver с driver.switch_to.window(driver.window_handles[0]), поэтому возникает ошибка:

selenium.common.exceptions.NoSuchWindowException: Сообщение: такого окна нет: целевое окно уже закрыто из неизвестной ошибки: веб-просмотр не найден

2) Вы должны поставить try и except еще одну конкретную строку кода, на мой взгляд, она слишком широка ...

Только для лучшей практики не следует использовать такие структурированные XPath:

driver.find_elements_by_xpath("/html[1]/body[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[1]/div[2]/div[2]/div[1]/div[1]/div[3]/div[1]/div[1]")

Это обязательно сломается.

Попробуйте использовать css-селектор или более конкретный XPath .

Надеюсь, это поможет вам!

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