导入webdriver:
from selenium import webdriver
创建 WebDriver 对象,指明使用chrome浏览器驱动:
wd = webdriver.Chrome(r'C:\Users\24644\Desktop\chromedriver.exe')
调用WebDriver 对象的get方法 可以让浏览器打开指定网址:如
wd.get('https://www.baidu.com')
输入字符串到输入框里,如: element.send_keys('博客园\n') (\n是回车)选择元素的方法:
根据 元素的id 属性选择元素,如:element = wd.find_element_by_id('kw')
根据 class属性 选择元素,如:wd.find_elements_by_class_name('animal')
找到的符合条件的所有元素,放在一个列表中返回
通过 WebElement 对象的text属性可以获取该元素在网页中的文本内容,如print(element.text)
根据 tag 名 选择元素,如:wd.find_elements_by_tag_name('div')
find_element 和 find_elements 的区别:
使用 find_elements
选择的是符合条件的 所有
元素, 如果没有符合条件的元素, 返回空列表
使用
find_element
选择的是符合条件的 第一个
元素, 如果没有符合条件的元素, 抛出 NoSuchElementException 异常
WebDriver 对象 选择元素的范围是整个 web页面,而
WebElement 对象 选择元素的范围是该元素的内部。
等待界面元素出现,如:
wd.implicitly_wait(10) 即后续所有的 find_element
或者 find_elements
之类的方法调用都会采用上面的策略:
如果找不到元素, 每隔 半秒钟 再去界面上查看一次, 直到找到该元素, 或者 过了10秒 最大时长。
操控元素的基本方法:
点击元素:调用元素WebElement对象的 click方法(点击的是该元素的中心点位置),如:wd.find_element_by_id('su').click()
输入字符串:调用元素WebElement对象的send_keys方法,如:element.send_keys('博客园')
获取元素信息:
获取元素的文本内容:通过WebElement对象的text属性,如:print(element.text)
获取元素属性:通过WebElement对象的get_attribute方法来获取元素的属性值,比如要获取元素属性class的值,就可以使用 element.get_attribute('class')
获取整个元素对应的HTML:可以使用element.get_attribute('outerHTML'),如果,只是想获取某个元素内部的HTML文本内容,可以使用 element.get_attribute('innerHTML')
获取输入框里面的文字:可以使用element.get_attribute('value')
获取元素文本内容2:通过WebElement对象的 text
属性,可以获取元素 展示在界面上的
文本内容。但是,有时候,元素的文本内容没有展示在界面上,或者没有完全完全展示在界面上。 这时,用WebElement对象的text属性,获取文本内容,就会有问题。出现这种情况,可以尝试使用 element.get_attribute('innerText'),或者 element.get_attribute('textContent')
CSS Selector:
根据 tag名、id、class 选择元素:
根据 tag名 选择元素的 CSS Selector 语法非常简单,直接写上tag名即可,如:elements = wd.find_elements_by_css_selector('div')
根据id属性 选择元素的语法是在id号前面加上一个#号: #id值,如:有元素:<input type="text" id='searchtext' />,选择它:
element = wd.find_element_by_css_selector('#searchtext')
根据class属性 选择元素的语法是在 class 值 前面加上一个点:.class值,如:elements = wd.find_elements_by_css_selector('.animal')
选择 子元素 和 后代元素:
子元素:如果元素2是元素1的直接子元素, CSS Selector 选择子元素的语法是这样的:元素1 > 元素2
后代元素:如果元素2是元素1的后代元素, CSS Selector 选择后代元素的语法是这样的:元素1 元素2(中间是一个或者多个空格隔开)
根据属性选择:
css 选择器支持通过任何属性来选择元素,语法是用一个方括号[ ] ,如:wd.find_element_by_css_selector('[href="http://www.miitbeian.gov.cn"]')
前面可以加上标签名的限制,比如 div[class='SKnet']
表示选择所有标签名为div,且class属性值为SKnet的元素。
CSS 还可以选择属性值包含某个字符串 的元素,比如, 要选择a节点,里面的href属性包含了 miitbeian 字符串,就可以写a[href*="miitbeian"]
可以选择属性值以某个字符串开头的元素,比如, 要选择a节点,里面的href属性以 http 开头 ,就可以写a[href^="http"]
还可以选择属性值以某个字符串结尾的元素,比如, 要选择a节点,里面的href属性以 gov.cn 结尾 ,就可以写a[href$="gov.cn"]
如果一个元素具有多个属性,CSS 选择器可以指定选择的元素要同时具有多个属性的限制,像这样 div[class=misc][ctype=gun]
验证CSS Selector:
按F12打开开发者工具栏,点击Elements标签后,同时按 Ctrl 键 和 F 键,就会出现搜索框,在里面输入任何 CSS Selector 表达式 ,如果能选择到元素,方框里面 就会显示出类似 2 of 3
这样的内容。of 后面的数字表示这样的表达式 总共选择到几个元素,
of 前面的数字表示当前黄色高亮显示的是 其中第几个元素
选择语法联合使用:
选择语法可以联合使用
组选择:
如果我们要同时选择所有class 为 plant 和
class 为 animal 的元素,css选择器可以使用逗号,称之为组选择 ,像这样.plant , .animal
按次序选择子节点:
父元素的第n个子节点:nth-child,如:选择第2个子元素,并且是span类型,这样写 span:nth-child(2)
父元素的倒数第n个子节点:nth-last-child,如:选择第倒数第1个子元素,并且是p元素,这样写p:nth-last-child(1)
父元素的第几个某类型的子节点:nth-of-type,如:选择的是第1个span类型的子元素,这样写span:nth-of-type(1)
父元素的倒数第几个某类型的子节点:nth-last-of-type,如:p:nth-last-of-type(2)
奇数节点和偶数节点:选择的是父元素的偶数节点,使用nth-child(even);选择的是父元素的奇数节点,使用nth-child(odd);
选择的是父元素的某类型偶数节点,使用nth-of-type(even);选择的是父元素的某类型奇数节点,使用nth-of-type(odd)
相邻兄弟节点选择:若h3后面紧跟着兄弟节点span,这就是一种相邻兄弟关系,可以这样写h3+span;
若选择h3后面所有的兄弟节点span,可以这样写h3~span
frame切换:
在html语法中,frame元素或者iframe元素的内部会包含一个被嵌入的另一份html文档。如果要操作被嵌入的html文档中的元素,就必须切换操作范围到被嵌入的文档中。
使用WebDriver对象的switch_to属性,如:wd.switch_to.frame(frame_reference),frame_reference可以是 frame 元素的属性 name 或者 ID ,如:
wd.switch_to.frame('frame1'),如果这2个属性都没有,可以根据frame的元素位置或者属性特性,使用find系列的方法,选择到该元素,得到对应的WebElement对象。
如果切换回原来的主html,可以使用wd.switch_to.default_content()
窗口切换:
用Selenium写自动化程序在新窗口里面打开一个新网址,并且去自动化操作新窗口里面的元素,会出现问题。问题就在于,即使新窗口打开了,这时候,我们的 WebDriver对象对应的还是老窗口,自动化操作也还是在老窗口进行。
如果要到新的窗口里面操作,可以使用Webdriver对象的switch_to属性的 window方法,如:wd.switch_to.window(handle),参数handle为新窗口的窗口句柄,如何找到新窗口的窗口句柄呢?代码如下:
1 for handle in wd.window_handles: 2 # 先切换到该窗口 3 wd.switch_to.window(handle) 4 # 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口 5 if '窗口名' in wd.title: 6 # 如果是,那么这时WebDriver对象就是对应的该该窗口,正好跳出循环 7 break
如果在新窗口操作结束后, 要回到原来的窗口,还可以事先保存该老窗口的句柄,代码如下:
1 # mainWindow变量保存当前窗口的句柄 2 mainWindow = wd.current_window_handle 3 #通过前面保存的老窗口的句柄,自己切换到老窗口 4 wd.switch_to.window(mainWindow)
选择框:
radio框:radio框选择选项,直接用WebElement的click方法,模拟用户点击。
checkbox框:对checkbox进行选择,也是直接用WebElement的click方法,模拟用户点击选择。
注意:要选中checkbox的一个选项,必须先获取当前,如果该选项已经勾选了,就不能再点击。否则反而会取消选择。因此可以先把已经选中的选项全部点击一 下,确保都是未选状态,再点击要选的选项。
select框:对于Select选择框,Selenium专门提供了一个Select类进行操作,Select类提供了如下的方法:
select_by_value:根据选项的value属性值,选择元素;
select_by_index:根据选项的次序(从0开始),选择元素;
select_by_visible_text:根据选项的可见文本,选择元素;
deselect_by_value:根据选项的value属性值,去除选中元素;
deselect_by_index:根据选项的次序,去除选中元素;
deselect_by_visible_text:根据选项的可见文本,去除选中元素;
deselect_all:去除选中所有元素。
Select单选框:不管原来选的是什么,直接用Select方法选择即可。
Select多选框:可以用select类的deselect_all方法,清除所有已经选中的选项。然后再通过Select方法选择。
更多动作:
对web元素做的操作,还有其他的操作,如:鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等,可以通过 Selenium 提供的ActionChains类来实现,先导入:from selenium.webdriver.common.action_chains import ActionChains,ac = ActionChains(driver)
冻结界面:
在开发者工具栏 console 里面执行如下js代码 :setTimeout(function(){debugger}, 5000)
即在5000毫秒后,执行 debugger 命令,执行该命令会浏览器会进入debug状态。debug状态有个特性,界面被冻住,不管我们怎么点击界面都不会触发事件。
弹出对话框:
弹出的对话框有三种类型,分别是 Alert(警告信息)、confirm(确认信息)和prompt(提示输入)
Alert:目的就是显示通知信息,只需用户看完信息后,点击 OK(确定) 就可以了。
模拟用户点击 OK 按钮:driver.switch_to.alert.accept()
要获取弹出对话框中的信息内容:driver.switch_to.alert.text
confirm:让用户确认是否要进行某个操作,有两个选择供用户选择,分别是 OK 和 Cancel, 分别代表确定和取消操作。
点击 OK 按钮:driver.switch_to.alert.accept()
点击 Cancel 按钮:driver.switch_to.alert.dismiss()
Prompt:需要用户输入一些信息,提交上去。
输入信息:driver.switch_to.alert.send_keys()
窗口:
获取窗口大小:driver.get_window_size()
改变窗口大小:driver.set_window_size(x, y)
获取当前窗口标题:driver.title
获取当前窗口URL地址:driver.current_url
截屏:get_screenshot_as_file
手机模式:desired_capabilities
上传文件:使用selenium自动化上传文件,我们只需要定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可
Xpath选择器:
未完待学