一、驱动浏览器
# 导入模块
from selenium import webdriver
import time
driver = webdriver.Chrome() # 创建驱动对象,启动浏览器
#定义一个获取窗口大小的函数
def get_window_size():
size = driver.get_window_size() # 获取窗口大小,
print(size) # 打印下窗口的尺寸大小
time.sleep(3) # 稍微等待一会
driver.get("https://www.baidu.com/") # 打开百度的网址
get_window_size() # 调函数获取当前的尺寸
driver.set_window_size(800, 600) # 重新设置尺寸
get_window_size() # 在获取尺寸,前后对比发现尺寸变成了我们设置的,证明重新设置尺寸成功了
driver.maximize_window() # 窗口最大化
get_window_size() # 看下最大化的窗口尺寸
下面是三次的窗口尺寸大小观察一下:
{'width': 1050, 'height': 660}
{'width': 800, 'height': 600}
{'width': 1296, 'height': 696}
第一种:获取截屏png图片,参数是文件名称,截屏必须是.png图片
# 导入模块
from selenium import webdriver
import time
driver = webdriver.Chrome() # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/")
time.sleep(3)
driver.get_screenshot_as_file(r"D:\python\code\img\1.png") # 调截图的方法,这是直接就会生成一张png的图片
time.sleep(2)
第二种:获取二进制数据流
# 导入模块
from selenium import webdriver
import os
driver = webdriver.Chrome() # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/") # 打开百度浏览器
img_dir = os.path.join(os.path.dirname(__file__), "img") # 定义png存放路径
if not os.path.exists(img_dir): # 判断路径是否存在
os.makedirs(img_dir)
png_data = driver.get_screenshot_as_png() # 截图,二进制流的
filename = os.path.join(img_dir, "test_screen.png") # 路径拼接
with open(filename, "wb") as f: # 把获取的二进制流的png信息写入到filename的路径中,最后生成的也是png的图片
f.write(png_data)
第三种:获取截屏的base64编码数据,在HTML界面输出截图时使用。
from selenium import webdriver
import os
import base64
driver = webdriver.Chrome() # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/") # 打开百度浏览器
img_dir = os.path.join(os.path.dirname(__file__), "img") # 定义png存放路径
if not os.path.exists(img_dir): # 判断路径是否存在
os.makedirs(img_dir)
base64_data = driver.get_screenshot_as_base64() # 截图,base64的流信息
png_data = base64.b64decode(base64_data)
filename = os.path.join(img_dir, "test_screen1.png") # 路径拼接
with open(filename, "wb") as f: # 把获取的二进制流的png信息写入到filename的路径中,最后也会生成一张png图片
f.write(png_data)
第四种方法:driver.save_screenshot(filename/full_path)。这种不放代码了,自己可以试着写下代码,进行扩展。
# 导入模块
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/") # 打开百度浏览器
time.sleep(5) # 睡眠一下,更直观的看见刷新的动作
driver.refresh() # 直接掉刷新
driver.find_element_by_id("kw").send_keys("易烊千玺", Keys.ENTER) # 这里面的Keys.ENTER是鼠标的操作,后面会讲到
time.sleep(2)
driver.back() # 后退回到上一个界面,就是百度的首页
time.sleep(2)
driver.forward() # 前进,再次回到搜索界面
二、介绍元素定位:
ps:元素定位涉及到了html的一些知识,比如网页的构成结构,什么是标签,什么是属性等。建议小伙伴们前去学习一下,不用太深,对于元素定位,把前面的弄懂就完全够用了。
webdriver提供了八种元素定位方式分别是:
id
name
class name
tag name
link text
partial link text
xpath
css selector
本篇先介绍前6种,只简单的介绍下怎么定位,driver定位的方法分别是什么。后面2种元素定位方式会单独的介绍,尤其是xpath,因为后面元素的定位几乎都是利用xpath来完成的。
上面的8中定位方式webdriver中对应的方式分别是:
driver.find_element_by_id("kw") # 括号里面写的是定位元素,字符串
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_elements_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_xpath()
driver.find_elements_by_css_selector()
图片的html源码是百度首页搜索框的:搜索框分别有class、id、name、tag name
利用这些来介绍前面的几种定位方式
driver.find_element_by_id("kw") # 会找到一处匹配的元素
driver.find_element_by_name("wd") # 会找到一处匹配的元素
driver.find_element_by_class_name("s_ipt") # 会找到一处匹配的元素
driver.find_elements_by_tag_name("input") # 会找到15处匹配项
此图片的HTML是百度首页左上角的文本的源代码,这几个text文本的共性是:点击之后都会打开一个新的网页,看源代码可以看出都有href属性,并且值都是一个网址,具有这样共性的就可以使用下面的定位方式去定位:
driver.find_element_by_link_text("新闻") # 精准匹配text文本
driver.find_element_by_link_text("hao123")
driver.find_element_by_partial_link_text("闻") # 模糊匹配text文本
driver.find_element_by_partial_link_text("123")
ps:使用模糊匹配text定位方式的时候,确保写的text只能在超链接文本中只能找到一个匹配项。要不找到多处直接点击就会报错了。
parial link 定位:是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的有一部分定位,只要这一部分信息可以唯一的标识这个链接。
上面的定位方式找到的都是只有一个匹配项,在定位中id的属性一般都是唯一的,其他的定位方式大部分都不是唯一的,当然webdriver还提供了匹配多处匹配项的方法,他们找到的是多处匹配项,并且把找到的所有都会给你提供过来。
driver.find_elements_by_id()
driver.find_elements_by_name()
driver.find_elements_by_class_name()
driver.find_elements_by_tag_name()
driver.find_elements_by_link_text()
driver.find_elements_by_partial_link_text()
driver.find_elements_by_xpath()
driver.find_elements_by_css_selector()
例子:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() # 创建驱动对象,启动浏览器
driver.get("https://www.baidu.com/") # 打开百度浏览器
time.sleep(5) # 睡眠一下,更直观的看见刷新的动作
eles = driver.find_elements_by_tag_name("input")
print(eles)
定位的是tag name:输出的内容是如下:
[<selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="e5e6e853-68f1-44b9-9851-0a1b4985dff7")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="41ceb448-3a92-4bb9-93b1-81c5621ebf13")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="55c33252-dddd-4a1e-99b1-437062e580ee")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="ef29f493-ba4b-4dc3-836d-12cc2c00ddde")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="83d3bef1-0d68-4aca-8d93-cbbbc2ff6dcd")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="353d98e2-48dc-4d01-885e-951644109fbf")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="8813d5e4-b272-4d90-bbc5-9e50cf93a7cc")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="68774183-de72-4210-85b5-b777f51e6b0e")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="6e2b2642-3ef3-45d6-bb18-189a24422659")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="70641aba-68a4-457b-a77a-e0bce27ec5af")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="79c3c111-3056-4643-a646-4d56fc000f62")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="a2aba76c-bbfe-48b1-9763-bf9c2a70e78b")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="ee63408b-9147-44aa-a6ca-3600fd0efe74")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="ccdd7aef-215e-4094-be83-e022d8e83f9f")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="46b9285c-8199-4f0b-8435-2c65165f1eb5")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="11f92382-105a-4ccf-9886-a28eeb6eb7a9")>, <selenium.webdriver.remote.webelement.WebElement (session="769cff6c644f35b7df8b7757f3633fad", element="89d9ba0e-fb5d-4df0-8de2-0f8010681d73")>]
这就是找到的搜索的匹配元素的对象。装成一个列表给你返回了。其实定位方式,方法都一样,和上面的定位方式对比发现,在element这一出,匹配多处的定位方法上多了一个s。相信根据大家来说肯定知道s一般指的就是多个的意思。这种定位方式返回的 是一个列表。但是在真正的自动化定位元素来说,找多处的方式是不推荐的。
小结
以上就是定位元素的一些方法。介绍的几种定位方法相对来说比较简单,我们理想状态下在一个页面当中每一个元素都会有一个唯一 id 和 name 属性值,我们通过它的属性值来找到他们,但在实际的项目中并非想象的这般美好。有时候一个元素并没有 id 或 name 属性,或者会有多个元素的。下一篇会介绍xpath定位和css定位。这两种定位在元素定位中可以找到99%的元素,并且找到的元素都是唯一的哦。