哪些不为人知的selenium-知识点,卧槽,牛批

tech2024-10-16  13

WebDriver

自动化测试代码:自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动) 浏览器的驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器 浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

po模型设计思想

Page Object模式是一种自动化测试设计模式,将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),提高用例的可维护性。

selenium框架编写自动化思路

import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys class PythonOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://www.python.org") self.assertIn("Python", driver.title) elem = driver.find_element_by_name("q") elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()

项目目录

1、将环境配置信息、测试用例数据及定位元素都放在单独的配置文件中 2、将公用工具放在utils文件夹下

下载浏览器驱动

1、selenium3对不同的浏览器进行了规范,没有提供默认的浏览器。想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。 Firefox浏览器驱动:geckodriver Chrome浏览器驱动:chromedriver , taobao备用地址 IE浏览器驱动:IEDriverServer Edge浏览器驱动:MicrosoftWebDriver Opera浏览器驱动:operadriver PhantomJS浏览器驱动:phantomjs

设置浏览器驱动

方法一:将浏览器驱动配置在系统环境变量中,然后验证不同的浏览器驱动是否正常使用。

from selenium import webdriver driver = webdriver.Firefox()

方法二:指定驱动器位置

webdriver.Firefox(executable_path="E:\\work_tool\\java\selenium\\geckodriver-v0.20.0-win64\\geckodriver")

加载chrome浏览器默认配置

1、chrome配置文件路径:在Chrome浏览器的地址栏输入:chrome://version/,查看个人资料路径并复制路径。 配置文件路径:/Users/macbookpro/Library/Application Support/Google/Chrome (不要Default,不然还是打开一个新用户) 2、加载默认配置

rom selenium import webdriver from time import sleep #个人资料路径 user_data_dir=r'C:\Users\xxxx\AppData\Local\Google\Chrome\User Data' #加载配置数据 option=webdriver.ChromeOptions() option.add_argument(user_data_dir) #启动浏览器配置 driver=webdriver.Chrome(chrome_options=option) driver.get('https://www.cnblogs.com/xiaobeibi/') sleep(2) driver.quit()

浏览器操作

driver.get(“http://www.google.com”):打开浏览器。selenium会等待静态元素加载完毕(其实是等到 onload 方法执行完毕) driver.maxmize_window:浏览器窗口最大化 driver.set_window_size(hight, wath) :设置浏览器高、宽 driver.get_window_size() :获取当前窗口的长和宽 driver.set_window_position() :设置浏览器位置 driver.get_window_position() :获取浏览器位置 driver.back() :浏览器回退 driver.forward(): 浏览器前进 driver.refresh(): 浏览器刷新 driver.close() :关闭浏览器 driver.quit():关闭浏览器且关闭驱动 driver.name:获取浏览器名称 driver.title :获取窗口标题 driver.page_source:获取浏览器页面信息 driver.current_url :获取当前URL driver.get_screenshot_as_file() //截图并保存为文件 driver.get_screenshot_as_base64 截图并保存为存64位二进制流格式,可嵌套邮件等 driver.get_screenshot_as_png 截图并保存为二进制流格式 driver.current_window_handle //获取当前页面的句柄 driver.window_handles //获取当前所有的句柄 driver.switch_to_active_element() //返回的是当前焦点的对象,即返回WebElement对象。 driver.switch_to_window(win_handle) //切换窗口 driver.switch_to_frame(id 或者name) //切换到新表单,网页里嵌套网页,通过src指定远程跳转地址 driver.switch_to_default_content() // 切回默认主frame driver.switch_to_alert() //跳转到警告窗口 警告框是windows系统自带的窗口。。页面上同时有且只有一个警告框出现 driver.accept() //确认 driver.dismiss() //取消 driver.text:获取文本值 driver.send_keys() :输入值 driver.session_id /获取session driver.get_cookies() //获取当前会话所有的cookie driver.get_cookie(‘’) //返回cookie driver.add_cookie(‘’) //添加cookie,添加cookies后需要刷新页面cookis才能生效 driver.delete_cookie(‘’) //删除cookie driver.delete_all_cookies()//删除浏览器cookies driver.implicitly_wait():设置智能隐式等待时间 driver.execute_script(js) 1.移除input只读属性 js = document.getElementById(\”text\”).readOnly = false 2.页面下滑到底部 js = window.scrollTo(0,3000) 3.显示 js=document.getElementById(\”img_good\”).style.display = \”block\” driver.find_element(by=By.ID, value = None) //找元素,没有找到元素向上拋异常 driver.find_elements(by=By.ID, value = None) //找一组元素,没有找到元素,返回[]

element = driver.find_element_by_id() //通过ID找元素 element = driver.find_elements_by_id() //通过ID找一组元素 element = driver.find_element_by_xpath() //通过xpath找元素 element = driver.find_elements_by_xpath //通过xpath找一组元素 element = driver.find_element_by_class_name() //通过class找元素 element = driver.find_elements_by_class_name() //通过class找一组元素 element = driver.find_element_by_name() //通过name找元素 element = driver.find_elements_by_name() //通过name找一组元素 element = driver.find_element_by_tag_name() //通过tag找元素 element = driver.find_element_by_tag_name() //通过tag找一组元素 element = driver.find_element_by_link_text() //通过link_text找元素 element = driver.find_elements_by_link_text() //通过link_text找一组元素 element = driver.find_element_by_partial_link_text() element = driver.find_elements_by_partial_link_text() element = driver.find_element_by_css_selector() //通过css找元素 element = driver.find_elements_by_css_selector() //通过css找一组元素

下拉框选项

from selenium.webdriver.support.select import Select Select(driver.find_element_by_id('s1Id’)).select_by_index(index) //通过索引定位 Select(driver.find_element_by_id('s1Id’)).select_by_value(value) //通过value值定位 Select(driver.find_element_by_id('s1Id’)).select_by_visible_text(text) //通过文本值定位

反选: 1 deselect_all # 取消全部的已选择项 2 deselect_by_index # 取消已选中的索引项 3 deselect_by_value # 取消已选中的value值 4 deselect_by_visible_text # 取消已选中的文本值

选项: options //获取所有下拉列表的选项 all_selected_options //获取所有被选中的选项 first_selected_option //获取第一个被选中的选项

元素属性及方法

element.send_keys() //模拟输入 element.clear() //清除元素内容 element.click() //点击元素 element.submit //提交表单 element.get_attribute(name) //获取属性值 element.is_displayed() //设置元素是否可见 element. is_selected() //元素是否选中 element.size //获取元素的高宽 element.text //获取文本值 element.tag_name //获取tag标签名 element.parent //获取父元素 element. value_of_css_property(‘’) //获取CSS的属性值 element. is_enabled()//判断元素是否可用

智能等待

1、显式等待使Webdriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() WebDriverWait(driver, 20, 1).until(EC.presence_of_all_elements_located(By.ID,'kw')) 123456

WebDriverWait类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下: WebDriverWait(driver, timeout, poll_frequency=0.5, ignored__exceptions=None) driver :浏览器驱动。 timeout :最长超时时间,默认以秒为单位. poll__frequency:检测的间隔(步长)时间,默认为0.58。 ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。 WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 until(method,message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。 until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。 通过as关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。 2、隐式等待是通过一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素 还没有被加载,则抛出 NoSuchElementException 异常。WebDriver 提供了 implicitly_wait() 方法来实现隐式等待,默认设置为0。

driver.implicitly_wait() elem = driver.find_element_by_name("q") implicitly_wait()默认参数的单位为秒,等待时间并非一个固定的时间,它并不影响脚本的执行速度。它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长还没有定位到元素,则抛出异常。

鼠标事件

from selenium.webdriver.common.action_chains import ActionChains driver = selenium.webdriver.Chrome() action = Action_Chains(driver) action.click() //在当前鼠标焦点处点一下 action.click(element) //点击元素,同element.click()效果相同 action.send_keys(‘键盘Keys.TAB’) //发送某个键到当前焦点的元素 action.send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素 action.drag_and_drop_by_offset() //拖拽到坐标点上 action.drag_and_drop(source, off) //从一个地方拖拽到另一个地方 action.release(on_element) //抬起鼠标,松开焦点 action.move_to_element() //鼠标移动到某个元素 action.move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标 action.double_click(on_element) //双击 action.click_and_hold(on_element) //按住不抬起 action.context_click(on_element) //鼠标右键 action.perform() //演示所有action效果,否则没有效果

键盘事件

from selenium.webdriver.common.keys import Keys key_down(value, element=None) ——按下某个键盘上的键 key_up(value, element=None) ——松开某个键 send_keys(Keys.BACK_SPACE) 删除键(backspace) send_keys( Keys. SPACE) 空格键(space) send_keys( Keys.TAB) 制表键(Tab) send_keys( Keys. ESCAPE) 回退键(esc) send_keys( Keys. ENTER) 回车键(enter) send_keys(Keys.CONTROL,’a’) 全选(ctrl+A) send_keys(Keys.CONTROL,’c’) 复制(ctrl+C) send_keys(Keys.CONTROL,’x’) 剪切(ctrl+X) send_keys(Keys.CONTROL,’v’) 粘贴(ctrl+v) send_keys(keys.F1) 键盘F1 …… send_keys(keys.F12) 键盘F12

By模块

By.ID By.NAME By.CLASS_NAME By.TAG_NAME By.LINK_TEXT By.PARTIAL_LINK_TEXT By.XPATH By.CSS_SELECTOR

XPATH

<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learning XML</title> <price>39.95</price> </book> </bookstore>

1、/bookstore 获取根元素 bookstore。 2、//book 获取所有 book 子元素 3、//title/@lang 获取所有书的语言 4、//BOOK[1]/price 获取第一本书的价格 5、//book[last()]/price 获取最后一本书的价格 6、//book[@cover]/price 获取包含cover属性的价格 7、//book[price>10 and price<30] /title 获取定价在【10,30】之间的标题 8、//book[count(autor)>1]/title/text() 获取作者多余1的书的标题 9、//book[not(@category=‘web’) and price<40]/author 10、//book[contains(title,’X’)]/price 获取标题名称包含X的定价 11、//book[starts-with(title, ‘X’)]/price 标题以X开头的价格 12、* 所有 13、[] 谓语,表示查询条件 14、 + - * /

上传文件

方法1: 【选择文件】是input标签的元素,且type=‘file’,可以尝试先定位到该元素,然后执行send_keys方法传入文件路径 方法2: 借助AutoIt工具 操作windows桌面软件、窗口等 可将编写的脚本存为.exe文件

下载文件

Chrome下载 download.default_directory:设置下载路径 profile.default_content_settings.popups:设置为0禁止弹出窗口

from selenium import webdriver import time options = webdriver.ChromeOptions() prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'} options.add_experimental_option('prefs', prefs) driver = webdriver.Chrome(executable_path='F:\chromedriver\chromedriver.exe', chrome_options=options) driver.get("http://pypi.Python.org/pypi/selenium") driver.find_element_by_xpath("//a[@id='files-tab']").click() time.sleep(5) #选择下载文件 driver.find_element_by_xpath("//a[contains(@href,'.tar.gz')]").click() time.sleep(30) driver.quit()

最后

俺叫小枫,一个成天想着一夜暴富的测试员

(1140267353)一起成长一起加油的伙伴群!软件测试,与你同行! 群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!

点赞关注不迷路!!!【三连ღ】,有问题也可私聊哟~(*╹▽╹*)

 

最新回复(0)