现在建设的网站有什么劣势,温州互联网公司,俄语网站建站,wordpress ps.w.org1.Frame框架 使用frame框架可以达到一个页面包含多个窗口#xff0c;可以理解为网页的嵌套#xff0c;比如在A网页中设置一块区域用来显示B网页的内容。在不进行处理的前提下不能操作B网页的内容。
1.1切换到iframe元素 driver.switch_to_frame( frame_element ) # frame_e…1.Frame框架 使用frame框架可以达到一个页面包含多个窗口可以理解为网页的嵌套比如在A网页中设置一块区域用来显示B网页的内容。在不进行处理的前提下不能操作B网页的内容。
1.1切换到iframe元素 driver.switch_to_frame( frame_element ) # frame_element是 iframe元素。 当我们执行这条语句后焦点就转换到了对应的 iframe框架内部此时我们就能操作内部的元素了但是不能操作外部的元素。
1.2 切换回主界面 driver.switch_to_default_content() 2.多窗口操作 我们在当前页面中点击一个链接打开另一个页面时焦点不会自动转换到另一个页面此时想操作另一个页面的元素时就会报 NoSuchElementException要避免这个错误需要我们手动切换到新打开的页面。
句柄浏览器窗口的表示符一个窗口对应一个唯一的句柄。
多窗口切换操作步骤 1.获取句柄 handles driver.window_handles() 2.切换句柄 driver.switch_to_window(handles[n])
句柄在列表中的索引顺序对应打开的顺序handles[0]对应启动界面。 3.截图 使用场景当断言失败后便于我们查看失败页面和失败原因 driver.get_screenshot_as_file(图片存储地址) 4.处理验证码
处理验证码的方式1.取消验证码 2.使用万能验证码 3.图像识别 4.cookie
我们主要使用cookie处理验证码对应操作步骤 1.手动登录一次抓包cookie 2.在脚本中添加cookie 3.刷新页面登录成功
driver webdriver.Chrome()
driver.get(https://www.baidu.com)
data {name:cookie_key,value:cookie_value} #这里对应的name和value需要提前抓包复制
driver.add_cookie(data)
all_cookies driver.get_cookies() #获取所有cookie
sleep(1)
driver.refresh() #刷新后未登录状态变为已登录状态5.PO模式 PO即 Page Object主要思想是将自动化涉及的页面或模块封装成一个类相较于原始写法提高了复用性和可维护性
5.1 PO层次
5.1.1 Base层 存放所有页面的公共方法如查找元素向文本框输入内容等。
from selenium.webdriver import Keys
from selenium.webdriver.support.wait import WebDriverWaitclass Base:def __init__(self, driver):self.driver driverdef base_find_element(self, loc, timeout10, frequency0.5): #loc[0]By.CSS_SELECTOR, loc[1]#idreturn WebDriverWait(self.driver , timeout , frequency).until(lambda x: x.find_element(*loc))def base_input(self, loc , value): #loc [By.ID, id]element self.base_find_element(loc)element.clear() #输入前先清空element.send_keys(value)def base_click(self , loc):self.base_find_element(loc).click()def base_get_text(self,loc):return self.base_find_element(loc).text
5.1.2 Page层 基于页面或模块单独封装当前要操作的对象需要继承自Base层调用基础的输入点击方法 page层中封装当前页面需要进行的操作比如现在为登录界面
那么封装的方法就包括输入用户名输入密码点击登录...from selenium.webdriver.common.by import By
from base.base import Base
准备的数据每个数据都是一个元组第一个元素是查找元素的方式第二个是值
在调用Base层的查找元素方法时解包lambda x: x.find_element(*loc)def base_find_element(self, loc, timeout10, frequency0.5):return WebDriverWait(self.driver , timeout , frequency).until(lambda x: x.find_element(*loc))
class PageLogin(Base):__loc_username (By.CSS_SELECTOR, #username)__loc_password (By.CSS_SELECTOR, #password)__loc_btn (By.CSS_SELECTOR, #btnLogin)def __page_login_input_username(self, value):self.base_input(self.__loc_username, value)def __page_login_input_password(self,value):self.base_input(self.__loc_password ,value)def __page_login_click_btn(self):self.base_click(self.__loc_btn)#整体登录业务包括输入用户名密码点击登录def page_login_transaction(self,username,password):self.__page_login_input_username(username)self.__page_login_input_password(password)self.__page_login_click_btn() 5.1.3 Script层 脚本层 unittest或者pytest