> 技术文档 > Selenium相关_selenium环境配置

Selenium相关_selenium环境配置


一、Selenium安装和环境配置

1.安装Selenium:cmd中输入 \"pip install selenium\"(\"pip list\"可查看安装版本号)

(若cmd说“pip不是内部命令或者外部命令”,找到安装python解释器的路径,路径中有个Scripts文件,将此路径复制到环境变量path中,然后重启,就解决啦。)

2.安装谷歌浏览器:浏览器功能和工具 - Google Chrome

3.安装驱动:cmd中输入 \"pip install webdriver_manager\" 

4.新建项目:创建项目时不要选虚拟环境,要选择自己安装的python解释器(这个python解释器的路径也要复制到环境变量path中)

5.chrome替换驱动下载地址:(这步是因为国内Google禁用,指定国内源下载驱动)

C:...\\Python39\\Lib\\site-packages\\webdriver_manager(python解释器的下载路径)中有个chrome.py文件,用pycharm打开,替换其中的两句代码

url=\"https://registry.npmmirror.com/-/binary/chromedriver\",
latest_release_url=\"https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE\",

6.自动下载驱动:驱动会被下载在.wdm文件中

Selenium依赖于浏览器和驱动浏览器的Driver,而且这两者需要配套。但测试中,chrome浏览器版本经常会自己变化(浏览器自动更新),对应匹配的Driver也就必须要对应改变。

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom webdriver_manager.chrome import ChromeDriverManager#创建浏览器配置对象option=webdriver.ChromeOptions()#设置浏览器不自动关闭option.add_experimental_option(\"detach\",True)#自动检测最新驱动并安装driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=option)#打开网页driver.get(\"https://cn.bing.com\")#设置最大化driver.maximize_window()

二、Selenium基本操作+HTML

F12中Elements定位元素

注意事项:

1.元素大小写敏感

2.浏览器先加载完页面,然后才能定位元素,可通过元素等待解决

HTML简介看这个:HTML介绍 - 酒剑仙* - 博客园

三、Selenium元素定位的8种方式:

导入包from selenium.webdriver.common.by import By

1.ID:ID需要唯一,不能是动态ID(两次不一样或者无序杂乱的一串)。

driver.find_element(By.ID,\'kw\').send_keys(\'python\')

2.name:name属性一般作为key给后端传数据。

driver.find_element(By.NAME,\'wd\').send_keys(\'python\')

3.class name:通过class属性的值定位。值唯一才可用,很多时候都不唯一。

driver.find_element(By.CLASS_NAME,\'s_ipt\').send_keys(\'python\')

4.tag name:通过标签名定位,一般情况页面标签会重复,很少能使用。

driver.find_element(By.TAG_NAME,\'input\').send_keys(\'python\')

5.link text:根据元素的文本信息定位,这里的文本信息指的是开始标签和结束标签之间的文本信息

driver.find_element(By.LINK_TEXT,\'hao123\').click()

6.partial link text:与上一个的区别在于:link text定位时文本必须写全;partial link text文本信息写一部分即可

driver.find_element(By.PARTIAL_LINK_TEXT,\'hao12\').click()

7.xpath:使用路径表达式来选取节点。选中代码,右击-复制-Xpath。

driver.find_element(By.XPATH,\'//*[@id=\"kw\"]\').send_keys(\'python\')

XPath 语法

路径表达式 结果

//*[@id=\"kw\"]

任意节点和位置的标签,只要有id属性并且值为kw //*[@id=] 任意节点和位置的标签,只要有id属性 //form/input[3] 选取form标签下的第三个input标签 //form

选取页面中的所有form子元素

//*[text()=\"新闻\"] 通过文本查找

8.css selector:通过CSS选择需要熟悉CSS语法

driver.find_element(By.CSS_SELECTOR,\'s_ipt\').send_keys(\'python\')

 CSS 选择器参考手册

CSS选择器(以百度为例)

选择器 例子 例子描述 图片例子 .class .s_ipt 选择class=\'s_ipt\'的所有元素 .clsaa1.class2 .bg.s_btn 选择class属性中同时有bg和s_btn的所有元素 .class1空格.class2 .s-bottom-layer-content .1h 选择作为class为s-bottom-layer-content的元素后代的class属性值是1h的元素 #id #kw 选择id=\'kw\'的元素 element.class input.s_ipt 选择class=\'s_ipt\'的所有元素 element,element div,p 选择所有

元素和所有

元素 element空格element div p 选择所有

元素内的所有

元素(所有后代) element>element div>p 选择父元素是

的所有

元素(父子) element+element div+p 选择紧跟

元素的首个

元素(兄弟) element~element div~a 选择前面有

元素的每一个元素 [attribute] [aria-label] 选择带有aria-label属性的所有元素 [attribute=\'value\'] [aria-label=\'百度热搜\'] 选择带有aria-label=\'百度热搜\'属性的所有元素 [attribute~=\'value\'] [class~=\'bg\'] 选择class属性包含bg的所有元素 [attribute|=\'value\'] [class|=\'s\'] 选择class属性的值是以s开头的所有元素 [attribute^=\'value\'] input[id^=\'k\'] 找input标签,id属性的值以k开头 :fist-child p:fist-child 选择属于父元素的第一个子元素的每个p元素 :last-child p:last-child 选择属于父元素的最后一个子元素的每个p元素

四、浏览器操作

4.1控制浏览器的大小

浏览器窗口最大化:driver.maximize_window()

浏览器窗口最小化:driver.minimize_window()

设置具体的浏览器窗口大小:driver.set_window_size()

4.2浏览器的前进、后退和刷新

前进:driver.forward()

后退:driver.back()

刷新:driver.refresh()

4.3关闭浏览器

close():关闭单个窗口(焦点所在的窗口,如果当前只有一个窗口直接会关闭浏览器)

quit():关闭所有窗口

4.4拖动浏览器滚动条

通过调用JavaScript代码拖动滚动条,元素得在页面显示出来才能定位

driver.set_window_size(555,555)#设置浏览器窗口为固定大小js=\'window.scrollTo(333,333)\'#将滚动条移动到指定位置,通过JavaScript的字符串实现driver.execute_script(js)#执行javaScript字符串
4.5浏览器窗口截图
driver.get_screenshot_as_file(r\'C:\\Users\\23689\\Pictures\\Saved Pictures\\1.png\')
4.6浏览器多窗口切换

driver.current_window_handle获取当前窗口句柄

driver.window_handles获取所有窗口的句柄,返回值是一个列表

switch_to.window()切换句柄

句柄不会自动切换,只能通过代码切换

五、WebDriver常用方法

click()点击

send_keys()输入

.submit()提交,相当于回车键

a=driver.find_element(By.CSS_SELECTOR,\".s_ipt\")a.send_keys(\'python\')a.submit()

.size:返回元素的尺寸,返回的是一个字典

ele_button=driver.find_element(By.ID,\'su\')#百度按钮print(ele_button.size)#{\'height\': 44, \'width\': 108}

.text:获取开始标签和结束标签之间的文本信息

.get_attribute(\"属性名\"):获得属性值

is_displayed():设置该元素是否用户可见

六、鼠标事件和键盘事件

鼠标事件导入包from selenium.webdriver import ActionChains

perform():执行

context_click():右击

double_click():双击

drag_and_drop():拖拽

move_to_element():悬停

from selenium.webdriver import ActionChainssetting_button=driver.find_element(By.CSS_SELECTOR,\'[id=\"s-usersetting-top\"]\')#获取元素ActionChains(driver).move_to_element(setting_button).perform()#鼠标悬停ActionChains(driver).double_click(setting_button).perform()#鼠标双击

键盘事件导入包from selenium.webdriver.common.keys import Keys,Keys类提供了键盘上所有按键的方法

.clear():清除输入框的所有内容

search_element=driver.find_element(By.ID,\'kw\')search_element.send_keys(\'mysqlabc\')search_element.send_keys(Keys.BACKSPACE*3)

.send_keys(Keys.CONTROL,\'v\'):组合键

七、获取断言信息

自动化测试如何判断测试是否通过?

  • 获取执行后的文本信息
  • 根据网页title进行断言
  • 根据url断言
ele=driver.find_element(By.XPATH,\"//*[@id=\'content_left\']//h3/a[1]/em\")print(ele.text)#获取网页文本 信息print(driver.title)#获取网页titleprint(driver.current_url)#h获取当前url

八、设置元素等待

强制等待:time.sleep(2)

  • 打开新页面或重新加载页面

隐式等待:driver.implicitly_wait(10)

  • 设置之后,后续每个元素在执行时都检查这个元素是否被加载出来,若加载出来才继续往后执行;
  • 若没加载出来,会在设置的最大时间之内,不断轮询该元素是否加载完成,若加载完成就继续执行,不用等到最大时间
  • 若超时还未加载出来会抛异常
  • 一般会设置到打开浏览器的后面

显示等待:

  • 针对某个具体元素来设置等待时间,而隐式等待是全局设置,每个元素都有效
from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC\"\"\"WebDriverWait(driver,超时时间,轮询时间)presence_of_element_located里面传入的是一个元组\"\"\"ele=WebDriverWait(driver,20,0.5)\\ .until(EC.presence_of_element_located((By.XPATH,\"//*[@id=\'content_left\']//h3/a[1]/em\")))

九、定位一组元素find_elements

eles=driver.find_elements(By.XPATH,\"//h3/a\")#获取多个元素用find_elementsfor i in eles: print(i.text)

为什么不能直接写print(eles)和print(eles.text):

  • 写print(eles)的结果是[<selenium.webdriver.remote.webelement.WebElement (session=\"7fab7ef07be516048816aa55e73507d7\"],因为这是获取了每个标题对应的元素对象
  • 写print(eles.text)的结果是AttributeError: \'list\' object has no attribute \'text\',因为获取的值是一个列表,列表没有text属性

十、iframe表单切换

.switch_to

iframe=driver.find_element(By.XPATH,\"//iframe[@frameborder=\'0\']\")#以126邮箱为例driver.switch_to.frame(iframe)

driver.switch_to.frame(0)通过iframe的索引切入iframe表单
driver.switch_to.frame(\'id value\')通过iframe的ID切入iframe表单
driver.switch_to.frame(\'name\')通过iframe的name切入iframe表单
driver.switch_to.parent_frame()回到上一级表单
driver.switch_to.default_content()跳回最外层页面

十一、警告框处理

有些弹窗能通过元素选择器选中,该弹窗是通过html标签实现的,直接通过元素定位操作即可

有些弹框通过JavaScript实现,无法直接定位,需特殊处理

  • alert:显示一条消息和一个ok按钮的警告框
  • confirm:显示一条消息和ok及取消按钮的对话框。用户点击确定,confirm()返回True;用户点击取消,confirm()返回False。
  • prompt:显示可提示用户进行输入的对话框。用户点击取消,则返回null;用户点击确认,则返回输入字段当前显示的文本。

十二、警告框处理 - 酒剑仙* - 博客园

  • .accept()点击确认
  • .dismiss()点击取消
  • .text返回文字信息
  • send_keys()发送文本到警告框

十二、下拉选择框

一种使用input标签做的假下拉框,就是普通的元素选择

另一种使用select标签实现的,使用Select类,使用类中的方法来处理下拉选择框

from selenium.webdriver.support.select import Selectele=driver.find_element(By.ID,value:\'s1Id\')#定位元素s=Select(ele)#实例化类,传入定位到的下拉选择框s.select_by_index(3)#根据索引选择s.select_by_value(\"o2\")#根据Value属性的值选择s.select_by_visible_text(\"谷歌搜索\")#根据文本信息选择

十三、文件上传

对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过send_keys()指定本地文件路径的方式实现文件上传。

driver.find_element(By.NAME,\'file\').send_keys(r\"E:\\壁纸\\1.jpg\")