Как идентифицировать два сообщения об ошибках с разными элементами и записать данные в excel в среде, управляемой данными

#python #selenium #if-statement #data-driven-tests

Вопрос:

Я новичок в Selenium /Python, у меня есть проверка входа в систему. когда пользователь попытается войти в систему, если пароль недействителен или истек, он отобразит сообщение об ошибке 2 с другим местоположением. данные поступают из Excel с циклом for. (Платформа, управляемая данными).

Если срок действия пароля для входа истек, он работает нормально. его переход на следующий, если пароль недействителен, все равно его проверка пароля выполняется только при условии истечения срока действия, и существует цикл, и выдается «ошибка». Это не проходит elif или else .

     print("Login Pass")
else:
    time.sleep(5)
    try:
        if (self.driver.find_element_by_xpath(
                self.lp.textbox_ConfirmPassword_xpath).is_displayed() == True) 
                or (self.lp.verifyInvalidPasswordIsDisplay() == "Invalid username or password"):
            if self.driver.find_element_by_xpath(self.lp.textbox_ConfirmPassword_xpath).is_displayed():
                self.driver.find_element_by_xpath(self.lp.textbox_ConfirmPassword_xpath).click()
                print("expired")
                XLUtils.writeData(self.path, 'Sheet2', r, 6, 'Expired password')
            elif self.lp.verifyInvalidPasswordIsDisplay() == "Invalid username or password":
                print("invalid")
                XLUtils.writeData(self.path, 'Sheet2', r, 3, 'Invalid username or password')
            else:
                XLUtils.writeData(self.path, 'Sheet2', r, 4, 'Error')

        else:
            print("error")
    except NoSuchElementException:
        XLUtils.writeData(self.path, 'Sheet2', r, 4, 'Error')
    print(self.user)
    print("login fail")
self.driver.close()
 

введите описание изображения здесь

Комментарии:

1. Привет, Шени, я ответил на твой вопрос. Пожалуйста, взгляните на это.

Ответ №1:

Если он не проходит elif self.lp.verifyInvalidPasswordIsDisplay() == "Invalid username or password": ни else через , это потому, что во всех условиях первый вложенный if (единственный оператор, который проверяет только self.driver.find_element_by_xpath(self.lp.textbox_ConfirmPassword_xpath).is_displayed() ) True , и он не будет проходить через другие elif else операторы nor.

Первый if (который содержит if-elif-else statements ) ,имеет такое условие:

 self.driver.find_element_by_xpath(
                self.lp.textbox_ConfirmPassword_xpath).is_displayed() == True
 

Однако за этим следует другое условие с or , но, похоже, во всех ситуациях textbox_ConfirmPassword_xpath оно есть True .

Так как это условие в точности повторяется в первом вложенном if , и, следовательно, условие этого if оператора всегда True , и оно не позволит проверять другие условия.

Во-первых, на мой взгляд, первое if не обязательно, и вы могли бы просто выполнять работу без него, вот так:

     print("Login Pass")
else:
    time.sleep(5)
    try:
        
        if self.driver.find_element_by_xpath(self.lp.textbox_ConfirmPassword_xpath).is_displayed():
            self.driver.find_element_by_xpath(self.lp.textbox_ConfirmPassword_xpath).click()
            print("expired")
            XLUtils.writeData(self.path, 'Sheet2', r, 6, 'Expired password')
        elif self.lp.verifyInvalidPasswordIsDisplay() == "Invalid username or password":
            print("invalid")
            XLUtils.writeData(self.path, 'Sheet2', r, 3, 'Invalid username or password')
        else:
            XLUtils.writeData(self.path, 'Sheet2', r, 4, 'Error')
            print('error')

    except NoSuchElementException:
        XLUtils.writeData(self.path, 'Sheet2', r, 4, 'Error')
    print(self.user)
    print("login fail")
self.driver.close()
 

Во-вторых, вам следует выбрать лучшее условие для первого if вместо self.driver.find_element_by_xpath(self.lp.textbox_ConfirmPassword_xpath).is_displayed() , так как, как я уже говорил ранее, по-видимому, во всех случаях это условие есть True .


Более того, я предлагаю использовать Constants для проверки равенства сообщений об ошибках, например:
Вместо "Invalid username or password" строки сделайте это:

 INVALID_USERNAME_PASS = "Invalid username or password"
.
.
.
self.lp.verifyInvalidPasswordIsDisplay() == INVALID_USERNAME_PASS: 
   # DO STUFF
 

Потому что, таким образом, это больше maintainable , и это hard coded больше не так.