Попробуй внутри наконец - PullRequest
       57

Попробуй внутри наконец

0 голосов
/ 07 апреля 2020

Я тестировал этот код. Все в порядке, включая сценарий ios с неправильным именем пользователя или паролем, пока не дойдет до раздела «Проверка входа». Есть проблема с тем, как написана моя попытка, за исключением того, что написано?

  def Login(userName, userPassword):
        loginURL = baseURL + 'login/'
        feedURL = baseURL + 'feed/'

        logging.info('Opens Login Page')
        driver.get(loginURL)
        sleep(randomTimer)

        try:
            driver.find_element_by_id('username').send_keys(userName)
            driver.find_element_by_id('password').send_keys(userPassword)
            sleep(randomTimer)
            driver.find_element_by_xpath('//button[text()="Sign in"]').click()

        except NoSuchElementException:
            logging.error('Was Not Able To Find The Elements')

        finally:
            # Username or password errors
            if driver.find_element_by_xpath('//div[@id="error-for-username"]') or driver.find_element_by_xpath('//div[@id="error-for-password"]'):
                logging.error('Username or Password Is Incorrect')
            else:
                # Login verification
                try:
                    WebDriverWait(driver, 10).until(driver.current_url == feedURL)
                    logging.info('Logging In Have Succeeded')
                except TimeoutException:
                    logging.error('Logging In Have Failed')

Возникает следующая ошибка:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //div[@id="error-for-username"]

edit:

def Login(userName, userPassword):
    loginURL = baseURL + 'login/'
    feedURL = baseURL + 'feed/'

    logging.info('Opens Login Page')
    driver.get(loginURL)
    sleep(randomTimer)

    try:
        driver.find_element_by_id('username').send_keys(userName)
        driver.find_element_by_id('password').send_keys(userPassword)
        sleep(randomTimer)
        driver.find_element_by_xpath('//button[text()="Sign in"]').click()

    except NoSuchElementException:
        logging.error('Was Not Able To Find The Elements')

    else:
        try:
            if driver.find_elements_by_xpath('//div[@id="error-for-username"]') or driver.find_elements_by_xpath('//div[@id="error-for-password"]'):
                logging.error('Username or Password Is Incorrect')
        except NoSuchElementException:
            pass
        else:
            try:
                WebDriverWait(driver, 10).until(ec.url_to_be(feedURL))
                logging.info('Logging In Have Succeeded')
            except TimeoutException:
                logging.error('Logging In Have Failed')

    finally:
        logging.info('Quiting The Driver')
        driver.quit()

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Ваше использование try / finally действительно неверно. Код в блоке finally выполняется всегда (в этом смысл этого утверждения), но в вашем случае, если код в первом блоке try поднимает NoSuchElementException, вы делаете не хочу идти дальше - это просто не имеет смысла.

0 голосов
/ 07 апреля 2020

Оператор finally всегда выполняется, поэтому при успешном входе в систему он попытается получить div с идентификатором «error-for-username» и потерпит неудачу.

Вместо этого вы можете разделить процесс входа в систему на 2 части и закройте все сценарии try..catch:

  1. Первая часть: процесс входа в систему
  2. Вторая часть: проверка успешности входа в систему (здесь рекомендуется остановить выполнение вашего скрипт в случае неудачного входа в систему)

Окончательный код будет выглядеть примерно так:

    try
        def Login(userName, userPassword):
            loginURL = baseURL + 'login/'
            feedURL = baseURL + 'feed/'

            logging.info('Opens Login Page')
            driver.get(loginURL)
            sleep(randomTimer)

            try:
                driver.find_element_by_id('username').send_keys(userName)
                driver.find_element_by_id('password').send_keys(userPassword)
                sleep(randomTimer)
                driver.find_element_by_xpath('//button[text()="Sign in"]').click()

            except NoSuchElementException:
                logging.error('Was Not Able To Find The Elements')
                # Quit the script
                driver.quit()
                sys.exit()


            try:
            # Username or password errors
                if driver.find_element_by_xpath('//div[@id="error-for-username"]') or driver.find_element_by_xpath('//div[@id="error-for-password"]'):
                    logging.error('Username or Password Is Incorrect')
                    # Quit the script
                    driver.quit()
                    sys.exit()
            except NoSuchElementException:
                #This mean that the login was sucessful
                pass

            WebDriverWait(driver, 10).until(driver.current_url == feedURL)
            logging.info('Logging In Have Succeeded')

    except Exception as e:

        logging.error('An error occured: ' + str(e))
        driver.quit()
        sys.exit()
...