Web自动化测试(1)-Selenium

安装、配置及元素定位

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空下的仰望者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值