(二)selenium 浏览器常用操作_八种元素定位

一、浏览器基本操作

1.1 、 启动

方法 作用
Chrome() 启动浏览器,不同浏览器方法名不一样
get() 打开某个网页,网页地址以参数传入方法
quit() 关闭浏览器

不同浏览器启动方法

# # Firefox 火狐浏览器
# driver = webdriver.Firefox()
#
# # 谷歌浏览器
# driver = webdriver.Chrome()
#
# # ie 浏览器
# driver = webdriver.Ie()
#
# # Edge 浏览器
# driver = webdriver.Edge()
#
# # Opera 浏览器
# driver = webdriver.Opera()
#
# # PhantomJS浏览器
# driver = webdriver.PhantomJS()

from selenium import webdriver

# 指定驱动位置
path = "D:\chromedriver.exe"
# 启动浏览器
driver = webdriver.Chrome(executable_path=path)
# 打开一个网页 如:百度
driver.get("http://www.baidu.com/")

# 关闭浏览器
driver.quit()

1.2、 浏览器窗口的操作

方法 作用
maximize_window() 窗口最大化
minimize_window() 窗口最小化
fullscreen_window() 全屏化窗口
set_window_size(width,height) 设置浏览器大小
set_window_position(x,y) 指定浏览器位置

# 窗口最大化
driver.maximize_window()
# 等待3秒
sleep(3)
# 窗口最小化  等于看不见
driver.minimize_window()
sleep(3)

# 窗口全屏化
driver.fullscreen_window()
sleep(3)

# 设置窗口大小  宽度,高度
driver.set_window_size(300,200)
sleep(3)

# 指定窗口位置 宽度,高度 以左上角 为坐标
driver.set_window_position(100,150)
sleep(3)


1.3 、网页基本操作

方法 作用
forward() 前进
back() 后退
refresh() 刷新
closs() 关闭

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()

# 指定驱动
driver_path = "D:\drivers\chromedriver.exe"
driver = webdriver.Chrome(driver_path,options=options)

# 先打开百度网页
driver.get("http://www.baidu.com")

# 等待五秒
sleep(3)

# 在打开东方财富网
driver.get("https://www.eastmoney.com/")

# 然后 后退 到百度
driver.back()

# 等待3秒
sleep(3)

# 在刷新一下
driver.refresh()

# 给1秒的缓冲
sleep(1)

# 在前进到 东方财富网
driver.forward()

#关闭网页 
driver.close()


二、元素定位

我们对网页的各种操作,其实都是对前端元素的操作,那你想实现自动化操作,首要就是查找你要操作的元素,只有匹配到元素才能实现后续的操作。

selenium 元素定位有八种方式

方法 作用
find_element_by_id() 根据id属性定位
find_element_by_name() 根据name属性定位元素
find_element_by_link_text() 根据超链接的文字信息
find_element_by_partial_link_text() 根据超链接的部分文字信息
find_element_by_tag_name() 根据tag名称
find_element_by_class_name() 根据class名称
find_element_by_xpath() 根据xpath表达式
find_element_by_css_selector() 根据css选择器

注:
find_element_by_xx
如果没有匹配到元素,则执行报错
如果匹配到一个元素,则返回元素
如果匹配到多个元素,则返回元素

find_elements_by_xx
如果没有匹配到元素,则返回空列表
如果匹配到一个元素,则返回包含一个元素的列表
如果匹配到多个元素,则返回包含多个元素的列表


2.1、 id定位

id 属性在html文件里具有唯一性,是我们优先使用的一种方法

from seleniumimport webdriver

d= webdriver.Chrome()
d.get('https://www.baidu.com')

d.find_element_by_id("kw").send_keys("hello")

2.2 、name 定位

from seleniumimport webdriver

d= webdriver.Chrome()
d.get('https://www.baidu.com')

d.find_element_by_name("wd").send_keys("hello")

2.3、 calss 定位

from seleniumimport webdriver

d= webdriver.Chrome()
d.get('https://www.baidu.com')

d.find_element_by_class_name('s_ipt').send_keys('hello')

# 复合class 如:class="bg s_ipt_wr quickdelete-wrap" ,有多个calss属性由空格隔开,我们只能取其中一个
d.find_element_by_class_name('s_ipt_wr')

2.4、 tag 定位

我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多重复的div,input,a等tag, 多个tag的时候 我们要用find_elements_by_tag_name() 他返回的是一个列表 ,我们要对这个列表选索引值进行操作 在我们工作中较少用这种定义方法,仅了解就行。

from selenium import webdriver

d = webdriver.Chrome("D:\chromedriver.exe")

d.get("http://www.baidu.com")
d.find_element_by_tag_name("area").click()

link_text 是我们定位一个超链接最常用的,我们的元素值就是这个超链接的文本 ,精确匹配

from seleniumimport webdriver
import time         # 调了一个时间模块

d= webdriver.Chrome()
d.get('https://www.baidu.com')

d.find_element_by_link_text('新闻').click()
time.sleep(5) # 让等待5秒
d.quit() 

partial_link_text 也用来定位超链接 ,只不过他与link_text 精确匹配不同 他是 一个模糊匹配

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()

# 指定驱动
driver_path = "D:\drivers\chromedriver.exe"
driver = webdriver.Chrome(driver_path,options=options)

# 先打开百度网页
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
sleep(1)
driver.find_element_by_id("su").click()
sleep(3)
# 模糊查找 selenium中文网 并点击一下
driver.find_element_by_partial_link_text("selenium中文网").click()

sleep(5)

driver.quit()

2.7、 xpath 定位,路径表达式定位

前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。


2.7.1 路径

绝对路径:从根节点开始,到目标位置

xpathstr ="/html/body/div[1]/div[1]/div/form/span[1]/input"
d.find_element_by_xpath(xpathstr)

特点:路径唯一,但是通常比较深,容易受页面改动影响

相对路径:从任意位置,或当前位置开始

xpathstr ="//input[@id='kw']"
d.find_element_by_xpath(xpathstr)

特点:书写形式灵活多样,推荐使用


2.7.2 相对匹配方式

下面是相对路径几种方式介绍

根据标签类型定位
  xpathstr ="//input"   这样写是匹配input类型的所有元素

根据顺序定位:
  xpathstr ="//inputp[2]"    有层级中的第二个input元素
  xpathstr ="//div[last()-1]    查找页面上各个层级中倒数第二个div元素

根据元素属性定位:
  xpathstr ="//input[@value]"    input类型的标签,并且有value属性的元素
  xpathstr ="//input[@value = 'kw']"   input类型value值为kw 的元素

使用运算符
  xpathstr ="//input[@value='kw' and @ id='ad']    input类型value属性值为kw 并且id属性为 ad的元素
  xpathstr ="//input[@maxlength <256]"      maxlength值小于256的input元素

层级与属性结合定位
  xpathstr = "//form/input"    form元素下的input子元素
  xpathstr = "//div[@class]/a[3]"    div的第三个a标签元素,div具有class属性

使用通配符
  xpathstr = "//tools/*"    选出所有的tools所有的子元素
  xpathstr = "//*[@*="s_tab"]"   任意类型,任意属性值为's_tab'的元素

模糊匹配
  xpathstr = "//a[contains(@href,'logout')]"  使用contains函数进行部分匹配
  xpathstr = "//a[contains(text(),退出)]"  超链接文本内容包括"退出字符"

xpath

更多可以参考:https://www.w3school.com.cn/xpath/index.asp

from seleniumimport webdriver
import time
d= webdriver.Chrome()
d.get('https://www.baidu.com')
# 定位搜索框,然后输入hello
d.find_element_by_xpath('//*[@id="kw"]').send_keys('hello')
time.sleep(5)
d.quit()

2.8、 css_selector 定位

css定位相对比xpath要简洁些,定位速度也要快些,selenium也比较推荐这种方式,但是学习起来会比较难理解,因为他有太多的样式,这里介绍一下比较简单常用的几种方式

选择器 例子 描述
#id #firstname 选择 id="firstname" 的元素。
.class .intro 选择 class="intro" 的所有元素。
element>element div > p 选择父元素是 <div> 的所有 <p> 元素。
[attribute=value] [target=_blank] 选择带有 target="_blank" 属性的所有元素。

更多可参考:https://www.w3school.com.cn/cssref/css_selectors.asp

from selenium import webdriver
import time
d = webdriver.Chrome()
d.get('https://www.baidu.com')
# 加断言,若在直接就下一步 不会有什么反应,如果不在 就会报错
assert '百度' in d.title  
# 先清除一下搜索框
d.find_element_by_css_selector('#kw').clear()
d.find_element_by_css_selector('#kw').send_keys('hello')
time.sleep(5)
d.quit()


在介绍两种现在比较推荐的方法

from selenium import webdriver
from selenium.webdriver.common.by import By

d = webdriver.Chrome("D:\chromedriver.exe")

d.get("http://www.baidu.com")

d.find_element(By.ID,"kw").send_keys("selenium")
d.find_elements(By.NAME,"wd")[0].send_keys("selenium")
原文地址:https://www.cnblogs.com/niunai/p/15057537.html