安装、配置及元素定位
1、安装
Selenium的安装比较简单,采用如下指令即可完成安装:
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2、下载浏览器驱动
Selenium支持多款浏览器,如谷歌Chrome浏览器、微软Edge、IE浏览器以及火狐浏览器等,其中Chrome浏览器的驱动可以在此处下载,微软Edge浏览器的驱动可以在此处下载。本文以Edge浏览器为例进行测试。将下载好的驱动解压至Selenium脚本所在目录即可。
3、访问网页
采用如下代码引入Selenium库并打开百度网页:
from selenium import webdriver
driver = webdriver.Edge()
driver.get("https://www.baidu.com")
4、定位元素
对于元素的定位通常可以利用id、name、class_name三种属性进行定位,要注意的是这些属性值必须在当前界面是唯一的,否则会定位出多个元素,首先按F12进入开发者模式,接着获取输入框属性信息,最后采用如下代码实现在输入框中输入“selenium”字符串:
###方法一:采用name进行定位
from selenium.webdriver.common.by import By
driver.find_element(By.ID,"kw").send_keys("selenium")
###方法二:采用name进行定位
driver.find_element(By.NAME,"wd").send_keys("selenium")
###方法三:采用name进行定位
driver.find_element(By.CLASS_NAME,"s_ipt").send_keys("selenium")
上述代码都可以实现在输入框中输入“selenium”进行搜索。然而,不是所有的元素都具有以上三个属性,以“新闻”为例,从下图中可以看出“新闻”元素没有id和name,利用Ctrl+F对class进行查找,发现存在多个相同的元素,因此想精确定位得更换方法,可以看出,页面中只存在一个“新闻”字符串,所以可以利用该信息进行定位,该信息被称为link text,定位代码如下:
driver.find_element(By.LINK_TEXT,"新闻").click()
上述代码可以实现点击网页中的“新闻”元素。与此同时也可以利用部分link text进行定位,代码如下所示:
driver.find_element(By.PARTIAL_LINK_TEXT,"闻").click()
如果上述五种定位方法均无法准确定位元素,还可以采用XPATH进行定位,仍然以新闻为例:
###法一,采用唯一属性进行定位:
driver.find_element(By.XPATH,"//a[@href='http://news.baidu.com']").click()
###法二,采用多属性and或者or的组合方式进行定位:
driver.find_element(By.XPATH,"//a[@href='http://news.baidu.com' and @target='_blank']").click()
###法三,采用部分属性进行定位
driver.find_element(By.XPATH,"//a[contains(@href,'news')]").click()
driver.find_element(By.XPATH,"//a[starts-with(@href,'http://news')]").click()
driver.find_element(By.XPATH,"//a[starts-with(@href,'http://') and contains(@href,'news')]").click()
driver.find_element(By.XPATH,"//a[substring(@href,1)='http://news.baidu.com']").click()
driver.find_element(By.XPATH,"//a[substring(@href,1,11)='http://news']").click()
driver.find_element(By.XPATH,"//a[text()='新闻']").click()
####若不清楚'新闻'元素的位置,可以用以下代码进行定位
driver.find_element(By.XPATH,"//*[contains(text(),'新闻')]").click()
但是也会存在同一页面中存在多个相同属性的元素,如下图所示,虽然href有差异,但是href的值可能会发生变化,此时使用上述方法无法实现定位,可以采取层级定位的方法。
对于层级定位来说,可以首先定位到唯一的父节点,接着利用索引定位至子节点,具体代码如下:
driver.find_element(By.XPATH,"//div[@id='s-top-left']/a[1]").click()
此外,可以利用driver.find_elements函数实现对一组元素的定位,具体使用方法与driver.find_element类似,示例如下:
elements = driver.find_elements(By.XPATH,"//a[@class='mnav c-font-normal c-color-t']")
if len(elements) > 1:
elements[0].click()
5、网页提示窗口处理
网页提示窗口的类型为alert,可以采用如下代码切换至弹窗,并打印提示信息,接着点击确定或取消按钮:
alert = driver.switch_to.alert()
print(alert.text)
alert.accept() #点击确定按钮
alert.dismiss() #点击取消按钮
6、元素无法定位
可能的原因主要有以下几点:
(1)定位方式或者定位语句是否正确,是否因为存在多个相同元素导致定位失败;
(2)页面由frame设计构成,需要先切换至元素所在的frame中,才能进行定位,切换方法如下:
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0])
如果要在不同的框架之间进行切换,需要跳出原来的框架,再切换至新的框架,若存在多级框架,可以一步一步跳回至上一级框架,再切换至新的框架:
###切换至主页面
driver.switch_to.default_content()
driver.switch_to.frame('frame_name2')
###切换至上一级框架
driver.switch_to.parent_frame()
driver.switch_to.frame('frame_name3')
(3)对于下拉框中的选项进行定位,需要在定位元素之后转换为下拉框对象,首先需要引入下拉框依赖包,接着将元素转换为Select对象,最后通过index、value或者visible text进行定位。
from selenium.webdriver.support.select import Select
select = Select(driver.find_element(By.NAME,""))
###下拉框元素定位方法
select.select_by_index()
select.select_by_value()
select.select_by_visible_text()