一、selenium的介绍
Selenium是一个流行的主动化测验东西,用于测验Web应用程序的功用和用户界面。它能够模拟用户在浏览器中的操作,如点击、输入文本、挑选下拉框等,以及验证页面元素的状况和特点。Selenium能够协助测验人员主动履行重复的测验使命,提高测验功率并削减人工错误。
二、selenium的原理
在咱们的主动化程序中,咱们需求导入selenium库中的WebDriver类来创立一个WebDriver目标,经过调用selenium客户端库相应的函数发送恳求给浏览器驱动(如ChromeDriver)。
当咱们运用WebDriver驱动程序履行代码时,WebDriver会将咱们的指令转化为HTTP恳求,并将其发送给浏览器驱动程序。
浏览器驱动是衔接Selenium库和浏览器的桥梁,它担任与浏览器进行通讯,并履行咱们编写的代码来控制和操作浏览器。
浏览器驱动程序接收到这些HTTP恳求后,会将其转化为浏览器可履行的指令,并将指令发送给浏览器进行履行。履行完成后,浏览器将成果回来给浏览器驱动程序,再由浏览器驱动程序将成果转化为HTTP响应,并将其回来给咱们的代码程序。
三、selenium的八种元素定位的办法
selenium完成UI主动化的要害就在于元素定位,可谓,只要定位了元素就能够调用办法对UI元素进行控制。在介绍元素定位的办法前,咱们需求先知道咱们定位的代码写得对不对,此刻F12的强大之处就体现出来了!
能够把开发者东西调出来,挑选Elements,随意点击一个元素,然后点击Ctrl+F,在此查找框能够查找到当时页面的一切元素,再把咱们定位元素的代码复制进行查找,若查找成果能定位到元素,则证明定位元素的办法写对了。
在selenium中,有八种元素定位的办法,下面将进行介绍。
1、ID定位:
find_element(By.ID, 'Id特点值')
举例:
id特点值为kw,则代码为find_element(By.ID, 'kw')
在 CSS 中,id是用于标识网页元素的一种重要特点而且id是仅有的,因此,若定位的元素存在id值的话,经过ID定位是一个十分快捷的办法。
2 、name定位:
find_element(By.NAME,'name特点值')
举例:
name特点值为referrer,则代码为find_element(By.NAME,'referrer)
3、class定位:
find_element(By.CLASS_NAME,'class特点值')
举例:
class特点值为foot-async-script,则代码为find_element(By.CLASS_NAME,'foot-async-script')
当class特点值有多个时,能够指定恣意一个class 特点值,都能够挑选到这个元素
4、tag定位:
find_element(By.TAG_NAME,'元素的标签值')
举例:
标签值为style,则代码为find_element(By.TAG_NAME,'style')
由于定位到的元素不仅有,所以咱们能够运用find_elements(By.TAG_NAME,'style')
,注意find_element和find_elements的差异,find_elements回来的是一个列表
5、link_text定位:
find_element(By.LINK_TEXT,'超链接文字')
举例:
如百度主页的视频则为超链接文字,代码可写为find_element(By.LINK_TEXT, '视频')
6、partial_link_text定位:
find_element(By.PARTIAL_LINK_TEXT,'超链接部分文字')
举例,
如超链接文字太长,也能够只输入部分,也能定位到元素, 如图上的“百度一下,你就知道-移动主页”特点值可写为:移动主页
,代码:find_element(By.PARTIAL_LINK_TEXT, '移动主页')
即可定位到元素
7、css定位:
find_element(By.CSS_SELECTOR,'css值')
更多的时分,元素是没有id、class值的,或许特点值不仅有,此刻咱们能够用CSS selector语法来挑选元素,CSS挑选器是Web开发中常用的一种定位元素的办法,能够在HTML文档中快速精确地找到所需的元素。
(1)经过标签名tag挑选元素
例如div,p,a等标签,例如,找出一切标签名为div的元素
find_elements(By.CSS_SELECTOR, 'div')
(2)经过类名class挑选元素
语法为在class值前加一个.
号,
举例:
代码为:find_element(By.CSS_SELECTOR, '.foot-async-script')
(3)经过ID挑选元素
语法为在id值前加一个#
号,
举例:
代码为:find_element(By.CSS_SELECTOR, '#result_tts_player')
(4)经过特点来挑选元素
语法为[特点名=特点值]
举例:
代码为:find_element(By.CSS_SELECTOR, '[name=theme-color]')
也能够与标签名、id值或许类名组合运用
如find_element(By.CSS_SELECTOR, 'meta[name=theme-color]')
(5)经过子元从来挑选
语法:元素1 > 元素2
若元素2在元素里边,如:
类特点wgt-navbar是类特点navbar-wrapper层级下的,则能够经过子元素语法来更精确的定位元素,代码为:find_element(By.CSS_SELECTOR, '.navbar-wrapper > .wgt-navbar)
(6)经过子孙元从来挑选
语法:元素1 元素2
与子元素相同,子孙元素也是在元素里边;不同的是,子元素只能是元素的直接子元素,而子孙元素能够不是直接子元素,子元素一定是子孙元素,子孙元素纷歧定是子元素。
比如元素a > 元素b > 元素c > 元素d,元素b是元素a的子元素,元素c是元素b的子元素但不是a的子元素,元素c是元素a的子孙元素。
举例:
类特点navbar-bg是类特点wgt-navbar层级下的,而wgt-navbar是navbar-wrapper的子元素,则navbar-bg是navbar-wrapper的子孙元素。
则能够经过子孙元素语法来更精确的定位元素,代码为:find_element(By.CSS_SELECTOR, '.navbar-wrapper .navbar-bg)
8、Xpath定位
XPath定位的优点是灵敏且功用强大,能够依据元素的特点、标签名、层级联系、文本内容等多个特征进行定位。在某些状况下,XPath定位或许更适合定位杂乱的元素结构或特殊的元素。然而,XPath表达式相对于CSS挑选器来说更杂乱一些,有时或许会更加冗长。因此,在实际运用中,能够依据具体的状况挑选运用CSS挑选器仍是XPath定位来定位元素。
XPath定位办法能够分为绝对途径和相对途径两种办法。
(1)绝对途径定位:
绝对途径是从根节点开端,经过一系列的节点途径来定位元素。绝对途径以斜杠/最初,表明根节点,然后按照节点层级联系逐级定位。例如,/html/body/div[1]/input表明从根节点开端,先挑选html元素,然后挑选body元素,再挑选第一个div元素,最终挑选其中的input元素。
(2)相对途径定位:
相对途径是相对于当时节点的途径,更常用且灵敏。相对途径以双斜杠//最初,表明从当时节点的恣意方位开端,挑选契合条件的元素。例如,//input表明挑选文档中一切的input元素,不管其在文档中的方位。下面介绍下如何依据元素的特点、标签名、层级联系、文本内容等特征进行定位。
//tagname: 挑选一切具有指定标签名的元素
//tagname[@attribute=’value’]: 挑选具有指定特点和特点值的元素。
//* [@attribute=’value’]: 挑选具有指定特点和特点值的恣意元素
//parent/child: 挑选父元素下的直接子元素。
//ancestor/descendant: 挑选ancestor元素下的一切descendant元素。
//* [text()=’value’]: 挑选具有指定文本内容的恣意元素。
XPath定位办法也支持运用逻辑运算符和多个条件进行定位。例如,能够运用and、or、not来组合多个条件。
四、selenium的常用元素操作
click(): 单击元素。
send_keys(value): 向输入框元素发送文本。
clear(): 清空输入框元素的文本。
get_attribute(name): 获取元素的指定特点值。
is_displayed(): 判别元素是否可见。
is_enabled(): 判别元素是否可用。
is_selected(): 判别元素是否被选中。
五、实例
需求: 从百度查找进入微博,然后获取微博热搜数据并输出到txt文档中
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class test(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
#self.driver.get('https://weibo.com/')
self.driver.implicitly_wait(10) #`全局等候`该办法接受一个参数, 用来指定最大等候时长
self.driver.maximize_window() #最大化浏览器页面
def baidu_search(self):
self.driver.find_element(By.ID,'kw').send_keys('微博') #经过id值定位
self.driver.find_element(By.CSS_SELECTOR,"[value=百度一下]").click() #经过CSS挑选器定位
self.driver.find_element(By.PARTIAL_LINK_TEXT,'微博-随时随地发现新鲜事').click() #经过超链接定位
for handle in self.driver.window_handles: #不断切换窗口至咱们想要的窗口:Sina
# 先切换到该窗口
self.driver.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判别是不是咱们要操作的那个窗口
if 'Sina' in self.driver.title:
# 如果是,那么这时分WebDriver目标便是对应的该该窗口,正好,跳出循环,
break
def get_weibo_hot_search(self):
time.sleep(10)
hot_search_list = self.driver.find_elements(By.XPATH, '//*[@class="wbpro-textcut f14 cla"]')
print(len(hot_search_list))
print(hot_search_list)
for list in hot_search_list:
hot_search_text=list.text
self.save_data(hot_search_text)
def save_data(self, hot_search_text):
with open(r'C:\Users\User\Desktop\output.txt', 'a', encoding='utf-8', newline='') as f: # 用追加的办法将数据保存到txt文件中
# for number,hot_search_text in hot_search.items():
f.write(hot_search_text+'\n')
def main(self):
self.baidu_search()
self.get_weibo_hot_search()
self.driver.quit()
if __name__ == '__main__':
ceshi = test() # 实例化目标
ceshi.main() # 调用类函数入口