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")
断点:
由于缺少具体的代码和错误信息,我无法确定您代码中到底哪一部分出了问题,但是超过默认的最大尝试次数,导致无法获取到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秒,如果元素没有被加载出来,将会一直等待,直到元素找到或者超时。
如果以上代码还是无法解决您的问题,我建议您检查代码中是否存在死循环或者重复操作等问题,也可以将错误信息提供给我,以便更好地排查问题。