selenium获取xpath方法封装出错

selenium封装
key获取_loc_获取了1000次超过默认最大次数导致xpath失败
page文件:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import visibility_of_element_located
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver

class BasePage:

    def __int__(self, driver: webdriver.Chrome()):
        self._driver = driver
        self._wait = WebDriverWait(driver, 10)

    def __getattr__(self, item):
        key = f"_loc_" + item
        xpath = getattr(self, key, None)
        # return xpath
        if xpath:
            return self.get_element(xpath)
        raise AttributeError("元素不存在")

    def get_element(self, xpath):
        el = self._wait.until(visibility_of_element_located((By.XPATH, xpath)))
        return el

class NewLoginPage(BasePage):
    # _loc_Register = '//*[@id="loginPanel"]/p[2]/a'
    _loc_Firstname = '//input[@id="customer.firstName"]'
    _loc_lastname = '//input[@id="customer.lastName"]'
    _loc_address = '//input[@id="customer.address.street"]'
    _loc_city = '//input[@id="customer.address.city"]'
    _loc_state = '//input[@id="customer.address.state"]'
    _loc_zipcode = '//input[@id="customer.address.zipCode"]'
    _loc_phone = '//input[@id="customer.phoneNumber"]'
    _loc_ssn = '//input[@id="customer.ssn"]'
    _loc_username = '//input[@id="customer.username"]'
    _loc_password = '//input[@id="customer.password"]'
    _loc_confirm = '//input[@id="repeatedPassword"]'
    _loc_register_login = '//input[@value="Register"]'

    def newlogin(self,firstname,lastname,address,city,state,zipcode,phone,ssn,username,password,confirm):
        # self.Register.click()
        self.Firstname.send_keys(firstname)
        self.lastname.send_keys(lastname)
        self.address.send_keys(address)
        self.city.send_keys(city)
        self.state.send_keys(state)
        self.zipcode.send_keys(zipcode)
        self.phone.send_keys(phone)
        self.ssn.send_keys(ssn)
        self.username.send_keys(username)
        self.password.send_keys(password)
        self.confirm.send_keys(confirm)
        self.register_login.click()

test文件:

import pytest
from pages_1 import *

@pytest.fixture(scope="session")
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://parabank.parasoft.com/parabank/index.htm")
    driver.find_element(By.XPATH, '//*[@id="loginPanel"]/p[2]/a').click()

    yield driver

    driver.quit()

def test_newlogin_true(driver):
    # driver.delete_all_cookies()
    # driver.refresh()
    # driver.get("https://parabank.parasoft.com/parabank/index.htm")
    # driver.maximize_window()
    page = NewLoginPage()
    page.newlogin("admin","admin","China","Beijing","Beijing","000000","000000","000000","admin","111111","111111"

断点:

img

  • 这篇文章:Selenium XPath根据文本内容查找元素的方法 也许有你想要的答案,你可以看看
  • 以下回答由chatgpt基于相关博客总结生成:

    由于缺少具体的代码和错误信息,我无法确定您代码中到底哪一部分出了问题,但是超过默认的最大尝试次数,导致无法获取到xpath信息,可能是因为需要等待页面加载。

    您可以尝试在获取key_loc之前,添加等待页面加载的代码,例如使用selenium自带的expected_conditions进行等待,代码如下所示:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    
    # 设置等待时间
    wait = WebDriverWait(driver, 10)
    # 等待页面加载key_loc元素,并获取他的xpath信息
    key_loc = wait.until(EC.presence_of_element_located((By.XPATH, "元素的xpath")))
    

    其中,EC.presence_of_element_located表示等待该元素的出现,By.XPATH表示使用xpath进行元素定位,"元素的xpath"表示待获取元素的xpath信息,10表示等待的最长时间为10秒。这个时间可以根据实际情况适当调整。

    另外,如果您想要一直等待页面加载完成,您可以使用driver.implicitly_wait()方法,在全局范围内给所有元素加上隐式等待,代码如下所示:

    # 设置全局隐式等待时间
    driver.implicitly_wait(10)  # 10秒
    # 获取key_loc元素的xpath信息
    key_loc = driver.find_element_by_xpath("元素的xpath")
    

    这样一来,每次查找元素前,selenium将会先等待10秒,如果元素没有被加载出来,将会一直等待,直到元素找到或者超时。

    如果以上代码还是无法解决您的问题,我建议您检查代码中是否存在死循环或者重复操作等问题,也可以将错误信息提供给我,以便更好地排查问题。