
Selenium中文官方文档Selenium常见问答基础概念1. 什么是SeleniumSelenium是一个用于Web应用程序自动化测试的开源工具套件支持多种编程语言和浏览器可以模拟用户行为来进行功能测试、回归测试等。Selenium家族包含多个组件Selenium WebDriver调用WebDriver对象直接与浏览器通信操作浏览器可通过编写脚本实现各种复杂的测试场景。Selenium IDE浏览器插件提供录制回放功能可以将录制生成多种编程语言脚本快速创建测试用例。Selenium Grid支持分布式测试在不同平台、浏览器的多台远程机器上并行/组合运行Selenium测试脚本集中管理测试执行提交效率。Selenium RC(Remote Control)Java语言编写服务端处理测试脚本发来的HTTP请求操作浏览器Selenium2后与WebDriver合并使用驻留Chrome、IE、FireFox浏览器。2. Selenium WebDriver的工作原理是什么测试脚本使用编程语言编写测试脚本调用WebDriver API。语言绑定将不同语言的API调用转换为统一的JSON格式命令。协议层将调用命令通过相关协议传输至浏览器驱动。浏览器驱动浏览器驱动执行操作并返回响应。3. 一个典型的测试脚本fromseleniumimportwebdriver#引入selenium webdriver模块driverwebdriver.Firefox()#初始化Firefox浏览器的webdriver对象启动浏览器driver.get(http://cn.bing.com/)#跳转到对应页面assertBingindriver.title#检查页面标题是否包含某一信息driver.quit()#关闭浏览器元素定位1. 常见的元素定位方法如何快速定位目标元素Chrome打开开发者工具点击 F12或右键-检查Way1: 使用元素选择器适合多次定位打开开发者工具点击左上角的鼠标箭头图标select the element on the page to inspect在网页中直接点击你想操作的元素开发者工具会自动跳转到该元素在DOM中的位置。Way2: 适合一次定位右键点击想要操作的元素选择检查Inspect右键HTML结构元素copy标识值。F12工具栏第一各图标-在页面中选择一个元素以进行检查可以以通过悬停在元素上方定位html语言。选中html语言点击右键可以复制selector/xpath等。8种元素定位方法通过元素id定位WebElement eledriver.find_element(id,value)WebElement eledriver.find_element(By.ID,value)WebElement eledriver.find_element(By.ID,stu_username_hide).send_keys(1234567879)元素Name‘name’ By.NAMExpath表达式‘xpath’ By.XPATHfind_element_by_xpath()driver.find_element(By.XPATH,/html/body/div/p[1])//根据元素的路径查找 driver.findElement(By.xpath(“//input[nameusername]”))。基于绝对路径以斜线/开始或相对路径以双斜线//开始定位基于索引路径[index]或属性路径[attribute“value”]定位通配符*基于轴定位following/preceding/parent基于函数“//a[text()“hao123”]或表达式“//a[contains(href, ‘hao123’) and text()‘hao123’]”定位完整超链接-通过链接文字定位‘link text’ By.LINK_TEXT部分链接‘partial text’ By.PARTIAL_LINK模糊匹配标签‘tag name’ By.TAG_NAME类名‘class name’ By.CLASS_NAMEcss选择器‘css selector’ By.CSS_SELECTORdriver.find_element(By.CSS_SELECTOR,#id)//根据id查找通过层级关系定位”span input“基于关键属性定位基于属性进行模糊定位组合式定位2. 如何选择定位方法优先用id具有唯一性、name通常是元素的唯一标识缺少id属性或id动态刷新时选择其它是否是超链接是超链接用link_text、partial_link_text否则用css_selector、xpathclass_name、tag_name很少用因为这俩个难以保证被定为元素或属性的唯一性先找到一类元素再通过具体的顺序位置定位到某一个元素XPath/cssSelector都是综合性查找方式当前6种可读性高的简单方式无法查找时选择。CSS运行速度更快XPath支持场景更丰富定位很强大更推荐使用XPath。3. 元素id动态刷新如何处理什么情况下元素id会动态刷新前段框架特性重新渲染、组件更新动态内容加载动态生成的元素滚动加载内容翻页后相同位置不同ID状态变化导致重新渲染清空表单、选项卡切换等安全防护机制缓存和性能优化如何识别动态id刷新页面后相同元素的id变化重复操作是id的后缀和前缀变化开发者工具观察到id带随机字符串框架生成的id包含哈希值如何应对id动态刷新使用不依赖具体id值的定位方式综合查找id属性部分值与开发团队协商避免完全随机的id添加稳定的xxid属性元素操作1. 页面元素基本操作Action: open\type\click\send_keys\clear\submit()下拉框操作根据“选项的文本”/“选项的值”/选项的索引定位多选框操作类似于单选框区别在于多选框可以取消选择.deselect_xxfromselenium.webdriver.support.selectimportSelect selectWebElement.select_by_visible_text([根据]);2. 获取页面元素内容获取元素的文本值webElement.text标签类型.tag_name选中状态.is_selected() # 返回布尔值可编辑状态: .is_enabled() # 返回布尔值判断元素是否已显示.is_displayed()HTML/DOM/CSS属性.get_attribute/get_property/value_of_css_property(“属性名称”)元素位置和大小.location/size/rect下拉框元素的选项浏览器操作1. 浏览器窗口导航.get(website)窗口最小化/最大化/关闭:.minimize_window/maximize_window/close()获取浏览器信息标题/网址.title/currrent_url窗口位置/大小:.get_window_position/size/rect()结束WebDriver会话driver.close()# 关闭WebDriver当前所在窗口driver.quit()# 关闭所有相关窗口并结束会话2. 浏览器弹框使用Alert类处理弹窗WebDriver中统一视为Alert对象driver.switch_to.alertAlert对象确认Confirmation确认/取消Prompt 输出框属于对应内容确认/取消driver.switchTo().alert().accept()#接受弹窗driver.switchTo().alert().dismiss()#关闭弹窗确认和取消Alert.accept/dismiss()获取弹出框的文本Alert.text向弹出框中输入内容Alert.send_keys(“context”)3. 浏览器多网页使用getWindowHandles方法获取所有窗口句柄然后使用switchTo方法切换到指定窗口driver.current_window_handle#获得WebDriver当前正在操作的窗口句柄driver.window_handles#获得该WebDriver实例下的全部句柄默认一个WebDriver实例打开一个窗口句柄当单击链接后在一个新的窗口显示该网页此时该WebDriver下将拥有两个窗口句柄driver.switch_to_window(窗口句柄)# 如driver.window_handles[1]IFrame切换嵌套网页现很少使用等待机制1. 页面级等待机制等待页面加载完毕的超时时间默认设置0代表等待时间不限。可测试对页面加载速度有明确要求的情况。仅对后续页面导航操作生效fromseleniumimportwebdriver driverwebdriver.Chrome()driver.set_page_load_timeout(最长等待秒数)driver.get(url)#driver.refresh()、driver.back()、driver.forward()2. 元素级等待机制2.1 非智能-强制等待无条件等待最简单也不推荐受性能影响降低效率容易让线程挂掉使程序抛异常importtime driver.find_element(By.LINK_TEXT,登陆).click()time.sleep(3)#delay3即3sdriver.find_element(By.LINK_TEXT,立即注册).click()2.2 智能-隐式等待全局设置在WebDriver整个生命周期生效全局设置一个超时时间默认0秒。使**find_element…**类函数在规定时间内找到元素找到立即停止等待否则一直等待至超时报错对操作类方法无作用driverwebdriver.Chrome()driver.implicitly_wait(10)driver.get(url)不适合的两种情况检查元素是否不存在会完整等待隐式等待的最大时长较多元素动态出现较多异步刷新和操作很多操作需要等待。2.3 智能-显式等待explicit wait有条件等待–最佳实践方式显示等待指定条件判断函数每隔一定时间检测该条件是否成立成立立刻执行下一步超时异常。#导入support.wait库中的WebDriverWait对象fromselenium.webdriver.support.waitimportWebDriverWait#实例化方法,默认间隔0.5sWebDriverWait(WebDriver实例,超时秒数检测时间间隔[可选]可忽略异常集合[可选]).until(EC.visibility_of_element_located((By.ID,example-element)))element.click()常用等待条件expected_conditions, EC条件方法 说明title_contains(title) 等待页面标题包含指定文本。presence_of_element_located(locator) 等待元素在 DOM 中存在不一定可见。visibility_of_element_located(locator) 等待元素在 DOM 中存在且可见宽高大于 0。element_to_be_clickable(locator) 等待元素可点击存在、可见且可交互。text_to_be_present_in_element(locator, text) 等待元素文本包含指定内容。frame_to_be_available_and_switch_to_it(locator) 等待 iframe 可用并切换进去。2.3.1 自定义条件等待defregisterLinkDisplayed(webDriver):returnwebDriver.find_element(By.LINK_TEXT,立即注册).is_displayed()driverwebdriver.Chrome()driver.get(url)driver.find_element(By.LINK_TEXT,登陆).click()WebDriverWait(driver,10).until(registerLinkDisplayed)driver.find_element(By.LINK_TEXT,立即注册).click()# .until_not(条件) 判断为False继续执行2.3.2 预定义条件等待导入from selenium.webdriver.support import expected_conditions高级应用键鼠模拟判断元素是否可视/坐标滚动到它elementdriver.find_element(By.ID,target-element)ifnotelement.is_displayed():# 如果元素不可见滚动到它driver.execute_script(arguments[0].scrollIntoView();,element)fromselenium.webdriver.common.action_chainsimportActionChains elementdriver.find_element(By.ID,footer)ActionChains(driver).scroll_to_element(element).perform()# 滚动到元素位置模拟鼠标移动和点击如何截图可以使用getScreenshotAs方法来进行截图File scrFile((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE)如何执行JavaScript可以使用executeScript方法来执行JavaScriptdriver.executeScript(window.scrollTo(0,document.body.scrollHeight))#滚动到页面底部Accessor将值保存至变量Assertions检查点。1Assert断言检查指定条件是否满足不满足终止test case运行2verify验证指定条件是否等于期望值若不满足则仅当前步骤失败继续执行下一步。Wait等待元素加载完成后操作。1***AndWait执行操作后等待页面刷新完成才进行下一步如clickAndWait点击并等待2waitFor***等待直到复合某一特定条件才进行下一步如waitForElementPresent 等待知道指定元素出现在页面上。隐式等待如果条件满足就立即执行下一步否则等到selenium IDE设置的最大等待时间因此具体等待时间不确定。pause显示等待明确了等待时间一定等到时间结束为止。selenium IDE默认最大等待时间30000ms(30s)超时未找到元素则测试步骤失败脚本抛出异常。常见问题如何保证UI的稳定性1元素的定位尽量唯一减少受页面布局的影响导致元素不稳定也可以多种定位方式备选2灵活运用等待机制如使用智能等待实例一、环境搭建0. 安装虚拟环境# Mac/Linux# 创建虚拟环境python3-m venv venv# 激活虚拟环境source venv/bin/activate1. 安装selenium库pip3installselenium2. 安装浏览器驱动将浏览器驱动放在python目录下简单起见将下载的msedgedriver.exe与py文件放在同一目录下可以不用配置环境变量。Edge驱动下载Microsoft Edge Driver - Microsoft Edge Developer代码中指定驱动位置Chrome驱动下载Download ChromeDriverChrome浏览器版本号查询在浏览器地址栏输入 chrome://settings/help# 指定 chromedriver 路径serviceService(/usr/local/WebDriver/bin/chromedriver)# 初始化浏览器以Chrome为例driverwebdriver.Chrome()# 你也可以传入executable_path参数指定chromedriver路径Note浏览器版本要和浏览器驱动匹配兼容二、初始化1. 启动浏览器驱动fromseleniumimportwebdriver wdwebdriver.Edge()#msedgedriver2. 设置等待时间wd.implicitly_wait(5)3. 打开网站wd.get(https://www.bv2008.cn/app/user/register.php?typeorg)4. 程序的最后关闭浏览器驱动wd.quit()三、选择元素1. 导入库fromselenium.webdriver.common.byimportBy2. 根据ID查找elementwd.find_element(By.ID,ID值)3. 根据css选择器查找精确匹配CSS Selector常用写法有哪些类型-如果有…选择器示例说明根据属性匹配xxx“xxx”input[xxxxxx]input[formcontrolname“username”]class“a b c”class_name.a.b.cbutton.mat-flat-button.action-button.mat-primarabc中可任选即可唯一即可如何验证你写的selector是否正确在开发者工具Console控制台中document.querySelector(你的 CSS 选择器)// or$$(input[formcontrolnameusername])如果返回一个HTML元素说明匹配成功使用CSS Selector的代码elementwd.find_element(By.CSS_SELECTOR,css选择器)4. 其他查找方法elementwd.find_element(By.CLASS_NAME,class属性)elementwd.find_element(By.TAG_NAME,标签名)5. find_element与find_elementsfind_element返回一个元素第一个 find_elements返回元素列表四、操作元素1. 输入文字send_keys()element.send_keys(文本)# 用于文本框2. 点击click()element.click()# 用于按钮、超链接、单选框、多选框、3. 下拉框选择sSelect(element)s.select_by_value(value值)# s.select_by_visible_text(文本信息)五、切换窗口1. iframe# 进入到iframewd.switch_to.frame(iframe名)# wd.switch_to.frame(element)# 回到原页面wd.switch_to.default_content()2. 切换页面forwindow_handleinwd.window_handles:wd.switch_to.window(window_handle)if内容inwd.title:break