selenium学习

学习网站:白夜黑羽

 

导入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 ActionChainsac = 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选择器:

 未完待学

 

 

 

 

 

   
上一篇:提取url的搜索字符串中的参数


下一篇:如何用java调用python的爬虫程序