当前位置: 首页 > news >正文

html网站开发实例教程关键词分类

html网站开发实例教程,关键词分类,网站建设需要使用哪些设备,莱阳网页设计文章目录 示例一:常见装饰器编写重试机制示例二:使用类实现装饰器示例三:使用函数装饰器并返回闭包示例四:使用 wrapt 模块 示例一:常见装饰器编写重试机制 示例代码 import time import traceback import logging from typing import Call…

文章目录

  • 示例一:常见装饰器编写重试机制
  • 示例二:使用类实现装饰器
  • 示例三:使用函数装饰器并返回闭包
  • 示例四:使用 `wrapt` 模块

示例一:常见装饰器编写重试机制

示例代码

import time
import traceback
import logging
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 设置日志配置
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)# 假设 DOME 是一个配置字典,用于控制 DEBUG 模式
DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):# 在每次重试前执行的操作,可以在此添加刷新页面等逻辑driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)  # 等待页面刷新完成def dec_retry(num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):"""装饰器,重复执行func并忽略异常,超过次数抛出异常或返回空,此函数默认输出异常信息"""def decorator(func):def dec(*args, **kwargs):for i in range(1, num + 1):try:return func(*args, **kwargs)except exclude as err:raise errexcept catch as err:logger.error(f'第 {i} 次执行失败')if out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= num:logger.error(f'已执行 {num} 次,抛出异常')raise errlogger.error('开始重试')exr(*args, **kwargs)return decreturn decorator@dec_retry(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):# 访问登录页面driver.get("https://example.com/login")# 等待页面加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))# 输入用户名username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)# 输入密码password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)# 点击登录按钮login_button = driver.find_element(By.ID, "loginButton")login_button.click()# 等待页面加载完成并检查是否登录成功WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():# 设置WebDriverdriver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()

代码解释

  1. 日志配置: 设置日志记录配置,用于输出错误信息。
  2. exr_func 函数: 定义了在每次重试前执行的操作,例如刷新页面。
  3. dec_retry 装饰器: 实现了重试机制,捕获指定异常,在重试次数用尽前会执行 exr_func 函数。
  4. login 函数: 实现具体的登录操作,并被 dec_retry 装饰器装饰。
  5. main 函数: 设置 WebDriver,尝试登录,并在失败时输出日志信息。

示例二:使用类实现装饰器

类装饰器可以更灵活地管理状态,并且可以更好地组织复杂的逻辑。

import time
import traceback
import logging
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 设置日志配置
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)# 假设 DOME 是一个配置字典,用于控制 DEBUG 模式
DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)  # 等待页面刷新完成class RetryDecorator:def __init__(self, num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):self.num = numself.exr = exrself.catch = catchself.exclude = excludeself.out_error = out_errordef __call__(self, func):def wrapped_func(*args, **kwargs):for i in range(1, self.num + 1):try:return func(*args, **kwargs)except self.exclude as err:raise errexcept self.catch as err:logger.error(f'第 {i} 次执行失败')if self.out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= self.num:logger.error(f'已执行 {self.num} 次,抛出异常')raise errlogger.error('开始重试')self.exr(*args, **kwargs)return wrapped_func@RetryDecorator(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):driver.get("https://example.com/login")WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)login_button = driver.find_element(By.ID, "loginButton")login_button.click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():driver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()

示例三:使用函数装饰器并返回闭包

使用闭包使代码更简洁。

import time
import traceback
import logging
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EClogging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)def dec_retry(num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):def decorator(func):def wrapped_func(*args, **kwargs):for i in range(1, num + 1):try:return func(*args, **kwargs)except exclude as err:raise errexcept catch as err:logger.error(f'第 {i} 次执行失败')if out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= num:logger.error(f'已执行 {num} 次,抛出异常')raise errlogger.error('开始重试')exr(*args, **kwargs)return wrapped_funcreturn decorator@dec_retry(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):driver.get("https://example.com/login")WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)login_button = driver.find_element(By.ID, "loginButton")login_button.click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():driver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()

示例四:使用 wrapt 模块

wrapt 是一个强大的装饰器库,可以更轻松地编写装饰器,特别是处理复杂逻辑时。

import time
import traceback
import logging
import wrapt
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EClogging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)def dec_retry(num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):@wrapt.decoratordef wrapper(wrapped, instance, args, kwargs):for i in range(1, num + 1):try:return wrapped(*args, **kwargs)except exclude as err:raise errexcept catch as err:logger.error(f'第 {i} 次执行失败')if out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= num:logger.error(f'已执行 {num} 次,抛出异常')raise errlogger.error('开始重试')exr(*args, **kwargs)return wrapper@dec_retry(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):driver.get("https://example.com/login")WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)login_button = driver.find_element(By.ID, "loginButton")login_button.click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():driver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()
http://www.hkea.cn/news/784326/

相关文章:

  • 郑州市做网站吉林百度查关键词排名
  • 济宁网站建设seo抖音seo源码搭建
  • 茂名网站建设方案书简述seo和sem的区别
  • 江西网站做的好的企业文化百度指数在哪里看
  • 山东电商网站建设seo网站排名优化公司
  • 赤峰市做网站公司今日的最新消息
  • 上海最大的贸易公司seo网络推广机构
  • jsp 网站开发广告发布平台
  • b2c网站综合对比评价站长统计幸福宝
  • 网站建设意见做推广app赚钱的项目
  • 哈尔滨营销网站制作做外贸推广
  • 深圳网站建设外贸公司排名搜索热词排名
  • 网络科技公司招聘可靠吗seo多久可以学会
  • 企业网站建设的方案ppt网络营销的特点主要包括什么
  • 如何自行建设网站推广关键词优化
  • 建设学院网站百度收录关键词查询
  • 有关外贸的网站有哪些内容武汉抖音seo搜索
  • 娄底网站建设的话术深圳网站关键词排名优化
  • 福田大型商城网站建设seo营销方法
  • 网站开发专业就业指导企业网站设计与实现论文
  • 网络营销方式的思维导图seo关键词优化系统
  • wordpress访客ip记录福清市百度seo
  • 网站下载速度慢互联网广告推广公司
  • 电影网站空间配置网络营销的工具和方法有哪些
  • 包装设计网站免费百度seo搜索引擎优化厂家
  • 免费做公司网站sem对seo的影响有哪些
  • 网站空间购买费用关键词优化计划
  • 网站制作可以卖多少钱陕西网站建设制作
  • 深圳中小企业网站制作谷歌海外广告投放
  • 做游戏网站的需求分析创建app平台