【问题标题】:Capturing span error for a text box with selenium python使用 selenium python 捕获文本框的跨度错误
【发布时间】:2020-07-19 08:34:22
【问题描述】:

使用下面的脚本,我试图从跨度错误文本框中获取错误文本,当未输入名称并且用户单击提交按钮时,从带有下面 HTML 的注册屏幕。(@ 987654321@。但是我最终只得到了文本而不是文本。当我尝试从 chrome 控制台获取文本时,我收到带有 xpath 和 css 选择器的文本“$x(”//span[@class='span -error']")[2]" 和 "$$(".span-error")[2]"。我想要一些关于我缺少什么的指导,我想我已经尝试了我能想到的一切。

测试用例:

  • 获取链接 在名字上不输入任何内容,获取验证 error 断言验证错误 Enter an invalid name as ":::" 获取 验证错误(他们似乎有一对)等等

from time import sleep
from conftest import os
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains


# LoginScreenSelectors
sel_first_name = "#first-name-su"
sel_last_name = "#last-name-su"
sel_email = "#email-su"
sel_password = "#password-su"
sel_error_message = ".span-error:nth-of-type(2)"
sel_submit = f"""[data-automation-id="signup-submit-btn"]"""
sel_required_error = f"""[data-error="required"]"""


class Login():
    '''This will signup to the applcaiton '''

    def __init__(self, driver):
        self.driver = driver
        wait = WebDriverWait(self.driver, 20)
        self.first_name = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, sel_first_name))
        )
        self.last_name = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_last_name))
        )
        self.email = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_email))
        )
        self.password = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_password))
        )
        self.submit = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_submit))
        )

    def login_to_website(self):
        wait = WebDriverWait(self.driver, 10)
        print(self.driver.title)
        self.first_name.click()
        self.first_name.send_keys("  ")
        self.first_name.send_keys(Keys.TAB)

        self.first_name_error_message = wait.until(
             EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_error_message))
         )
        type(self.first_name_error_message)
        error_messages = []
        for messages in self.first_name_error_message:
            print(error_messages.append(messages.text))

        #if i could get this then i could simply get the first index and then keep filtering
         it but even that is proving to be difficult.

【问题讨论】:

    标签: css selenium pytest


    【解决方案1】:

    试试这个以获取所有带有错误消息的元素

    error_messages = self.driver.find_elements(By.XPATH, "//*[@id="sign-up-form"]/div/span[2]']")
    

    【讨论】:

    • 用更好的 XPATH 更新了 XPATH,返回 4 个带有错误消息的 span 元素
    【解决方案2】:

    这就是我最终解决它的方法。

    将 xpath 设为f"""[data-error="required"]""",然后使用 for 循环循环遍历输入字段的所有错误消息,我希望这将有助于任何试图在同一测试用例上验证快乐和消极测试的人。

    from time import sleep
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    # LoginScreenSelectors
    sel_first_name = "#first-name-su"
    sel_last_name = "#last-name-su"
    sel_email = "#email-su"
    sel_password = "#password-su"
    sel_submit = f"""[data-automation-id="signup-submit-btn"]"""
    sel_required_error = f"""[data-error="required"]"""
    
    class Register():
    '''This wil register the user to the application '''
    
    def __init__(self, driver):
        self.driver = driver
        wait = WebDriverWait(self.driver, 20)
        self.first_name = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, sel_first_name))
        )
        self.last_name = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_last_name))
        )
        self.email = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_email))
        )
        self.password = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_password))
        )
        self.submit = wait.until(
            EC.visibility_of_element_located((By.CSS_SELECTOR, sel_submit))
        )
    
    def login_to_website(self):
        wait = WebDriverWait(self.driver, 10)
        '''This will check for validaitons'''
        self.last_name.send_keys("Test Automation Last Name")
        self.email.send_keys("a@b.com")
        self.password.send_keys("password")
        self.submit.click()
        self.first_name_error_message = wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error))
        )
        for first_name_required_message in self.first_name_error_message:
            first_name_message = first_name_required_message.text.replace("\n", ":")
            # print(first_name_message)
            # print(first_name_message[first_name_message.find(":") + 1:])
        assert first_name_message[first_name_message.find(":") + 1:] == "First name is required."
        sleep(1)
        self.last_name.clear()
        self.first_name.click()
        self.first_name.send_keys("Test Automation First Name ")
        self.submit.click()
        self.last_name_error_message = wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error)))
    
        for last_name_required_message in self.last_name_error_message:
            last_name_message = last_name_required_message.text.replace("\n", ":")
            assert last_name_message[last_name_message.find(":") + 1:] == "Last name is required."
    
        self.email.clear()
        self.last_name.click()
        self.last_name.send_keys("Test Automation Last Name ")
        self.submit.click()
        self.email_error_message = wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error)))
    
        for email_required_message in self.email_error_message:
            email_message = email_required_message.text.replace("\n", ":")
            assert email_message[email_message.find(":") + 1:] == "Email address is required."
    
        self.password.clear()
        self.email.click()
        self.email.send_keys("your@email.com")
        self.submit.click()
        self.password_error_message = wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, sel_required_error)))
        '''only way i could assert it '''
        for password_required_message in self.password_error_message:
            password_message = password_required_message.text.replace("\n", " ")
            assert password_message[password_message.find("d") + 1:]\
                                                    .replace(" ", "")  == "passwordisrequired."
    
        self.password.click()
        self.password.send_keys("something123$")
        self.submit.click()
    

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 2022-01-15
      • 2020-02-13
      • 2019-01-29
      • 2018-12-15
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多