例子说明
寻思着用每天都登录的CSDN博客来试验一下selenium的功能吧,以下是小例子说明:
打开CSDN博客的python板块,查看前10条博客。
例子脚本
from selenium import webdriver
import unittest
import time
class TestCSDN(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Chrome()
self.base_url=r"https://blog.csdn.net/"
def closeNewWindow(self):
handles=self.driver.window_handles
self.driver.switch_to.window(handles[-1])
self.driver.close()
self.driver.switch_to.window(handles[0])
def test_python(self):
# 将浏览器窗口最大化,打开CSDN博客首页,设置隐式等待时间10秒钟
self.driver.maximize_window()
self.driver.get(self.base_url)
self.driver.implicitly_wait(10)
# 点击打开Python板块
time.sleep(3)
self.driver.find_element_by_link_text("Python").click()
# 点击打开第1个博客,等待几秒后,关闭此博客页面
time.sleep(3)
blogs=self.driver.find_elements_by_xpath("//ul[@id='feedlist_id']/li/div/div/h2/a")
blogs[0].click()
time.sleep(5)
self.closeNewWindow()
# 点击查看博客列表中第2到10个博客
for blog in blogs[1:10]:
blog.click()
time.sleep(5)
self.closeNewWindow()
def tearDown(self):
time.sleep(5)
self.driver.quit()
if __name__=="__main__":
unittest.main()
定位多个元素
find_elements_by_id(或by_name、by_xpath之类):
定位多个元素,以前刚接触的时候想这个有啥用,最近操作的多了,才知道它的用途:
表格或者列表,他们通常由多个行组成,或者说由多个同类的元素组成。若想定位其中某个行,可以用find_elements_by_id先获取到所有行组成的列表list,然后再使用list[n]来定位其中的某一行。
比如本文中的例子,网页中博客列表的元素如图(使用Chrome开发者工具可查看到网页HTML的元素):
ul是列表,li是每一行博客,每个博客中又分为了好多个div小块,图片中亮色显示的a超链接元素,才是博客的标题部分,但是列表中显示的博客并不是固定的。
blogs=self.driver.find_elements_by_xpath("//ul[@id=‘feedlist_id’]/li/div/div/h2/a")
blogs[0].click()
使用本语句先定位到所有超链接,并保存到列表blogs中。然后再使用列表blogs[index]来定位具体某一行。index从0开始。
切换和关闭新窗口
点击博客标题后,会打开一个新的窗口显示博客具体内容。此时我们可使用如下语句进行窗口切换,将操作的对象变为新窗口。
1)handles=self.driver.window_handles
获取到当前所有浏览器窗口的句柄,并保存到列表handles中。
本例子中此时包含2个句柄,CSDN python博客列表页,以及新打开的博客具体内容页面。
2)self.driver.switch_to.window(handles[-1])
使用切换窗口方法,切换到句柄列表中最后一个句柄对应的窗口,即新打开的页面。
当博客查看完毕后,关闭博客所在窗口,切换回CSDN博客网页:
3)self.driver.close()
关闭当前窗口
4)self.driver.switch_to.window(handles[0])
使用切换窗口方法,切换到句柄列表中第一个句柄对应的窗口,即CSDN python博客列表页。