Python Selenium介绍(二)

加载指定页面并关闭

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
# 打开指定(Firefox)浏览器
browser = webdriver.Firefox()
# 指定加载页面
browser.get("http://www.csdn.net/")
# 设置五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()

元素定位和获取

  • 我们需要了解网页的结构,打开网页按F12,或者右键页面,然后点击【检查】;即可看见到我们的开发者界面

  • 就可以html代码了,那个元素就想树形图一样的排列,所以我们获取的方法有很多种

  • 现在默认你有前端的基础,了解HTML

  • 当我们打开了网页,我们就可以获取网页上的任何东西

  • 当然,一般我们只需要获取网页上的一些数据信息,文本内容

Selenium有很多元素筛选方法,通过class、id等等进行筛选

元素定位

元素定位方法包含了2个系列:

  • find_element()系列:用于定位单个的页面元素。
  • find_elements()系列:用于定位一组页面元素,获取到的是一组列表。

标签id属性定位

find_element(By.ID,'XX')id定位,根据元素的id属性值定位,最为方便且唯一,但有可能不存在,也可能动态生成。

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开指定(Firefox)浏览器
browser = webdriver.Firefox()
# 指定加载页面
browser.get("http://www.csdn.net")
# 通过id属性获取搜索输入框
input_text = browser.find_element(By.ID, "toolbar-search-input")
# 向搜索输入框内输入selenium
input_text.send_keys("selenium")
# 设置停留五秒后执行下一步
time.sleep(5)
# 关闭浏览器
browser.quit()

标签name属性定位

find_element(By.NAME,'xx')name定位,根据元素的name属性值定位,定位到的标签不一定是唯一的。

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.baidu.com/")
# 通过name属性选择文本框元素,并设置内容
browser.find_element(By.NAME,'wd').send_keys("selenium")
# 通过通过ID属性获取"百度一下"按钮,并执行点击操作
browser.find_element(By.ID,"su").click()
# 停留五秒后关闭浏览器
time.sleep(5)
browser.quit()

标签class属性定位

find_element_by(By.CLASS_NAME,'xx')class定位,根据元素的class属性值定位,但可能受JS影响动态变化。定位到的标签不一定是唯一的。

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.baidu.com/")
time.sleep(2)
# 通过class属性选择元素
browser.find_element(By.CLASS_NAME,'s_ipt').send_keys("CSDN")
time.sleep(2)
browser.find_element(By.ID,"su").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

标签tag定位

find_element(By.TAG_NAME,'xx')tag name定位,根据元素的标签名定位,定位到的标签不一定是唯一的。

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
time.sleep(2)
# 选择<button></button>标签(搜索按钮),执行点击操作
browser.find_element(By.TAG_NAME, "button").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

link定位

  • link表示包含有属性href的标签元素,如:linktext可以通过LINK_TEXT进行定位。
  • find_element(By.LINK_TEXT,'XX')根据链接文本全匹配进行精确定位。
  • find_element(By.PARTIAL_LINK_TEXT,'XX')根据链接文本模糊匹配进行定位。
python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 选择<a href="https://blog.csdn.net/nav/back-end">Python</a>标签,执行点击操作
browser.find_element(By.LINK_TEXT, "Python").click()
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()
python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 选择<a href="href="https://blog.csdn.net/nav/ai">人工智能</a>标签,执行点击操作
browser.find_element(By.PARTIAL_LINK_TEXT, "人工").click()
# 停留五秒后关闭浏览器
time.sleep(3)
browser.quit()

元素的xpath定位

xpath是一种在XML文档中定位元素的语言

  • 使用绝对路径定位

    • 指的是从网页的HTML代码结构的最外层一层层的写到需要被定位的页面元素为止。
    • 绝对路径起始于/,每一层都被/所分割。/html/body/div[2]/form/input[3]
      • 注解:
        (1)可以用中括号选择分支,div[2]代表的是当前层级下的第二个div标签;
        (2)一般情况下较少使用绝对路径的方式做定位,原因在于绝对路径的表达式一般太长,不便于后期的代码维护,代码的微小改变就可能导致这个路径失效,从而无法完成元素定位。
  • 使用相对路径定位

    • 不是从根目录写起,而是从网页文本的任意目录开始写。

    • 相对路径起始于//,//所表示的含义是"任意标签下" //input[@id='kw']

      • 注解:
        (1)示例的含义:在当前页面查找任意目录下的input元素,且该元素的id属性取值为kw
        (2)在xpath里,属性以@开头
        (3)所选取的属性可以是任意属性,只要其有利于标识这个元素即可
        (4)推荐使用相对路径结合属性的这种xpath表达式,它往往更简洁更易于维护
        (5)有时候可能会出现一个属性不足以标识某个元素,可以使用逻辑运算符and来连接多个属性进行标识。//input[@xx='aa' and @yy='bb']
        (6)有时候一个元素它本身没有可以唯一标识它的属性,这时我们可以找它的上层或者上上层, 然后再往下写。//input[@xx='aa']/p

find_element(By.XPATH,'XX')根据元素的xpath表达式来完成定位,可以准确定位任何元素。

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By

# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 通过xpath定位输入框,输入内容selenium
browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium')
# 停留五秒后关闭浏览器
time.sleep(5)
browser.quit()

css选择器定位

  • find_element(By.CSS_SELECTOR,'XX')根据元素的css选择器来完成定位,可以准确定位任何元素,但需要熟练- 掌握css选择器

  • css选择器

    (1)类选择器--------.XXX选择class属性为xxx的元素

    (2)id选择器-------- #XXX选择id属性为xxx的元素

    (3)元素选择器-----XXX选择标签名为xxx的元素

    (4)属性选择器-----[yyy='bbb']选择yyy属性取值为bbb的元素

    (5)派生选择器-----AA>XX或AA XX选择AA标签下的XX元素

  • 你可以通过获取xpath的方式来从页面获取css选择器

    在css里标识层级关系使用的是>或者空格(xpath里使用的是/)div#xx1>input.yy2

注意:对于css的属性值来说,可以加引号也可以不加,注意属性的引号和整个CSS表达式的引号要进行区分。对于xpath的属性值来讲,需要加上引号,否则报错。

python 复制代码
import time
# 导入selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
# 启动并打开指定页面
browser = webdriver.Firefox()
browser.get("http://www.csdn.net")
# 通过css选择器定位输入框,输入内容selenium
browser.find_element(By.CSS_SELECTOR, '#toolbar-search-input').send_keys('selenium')
# 停留三秒后关闭浏览器
time.sleep(3)
browser.quit()

元素定位方式区别

模糊匹配获取元素 & 联合多个样式

python 复制代码
main_line_list = chromedriver.find_elements(By.XPATH, 
f"//span[@class='fancytree-title' and contains(@title, '干线')]")

这里既筛选了class中的内容,又筛选了这个span标签里面的文本信息

其实,一般情况下,我们可以直接模糊匹配内容就足够了!

也就是直接使contains!!!所以这就是为什么建议使用xpath了

拉姆达表达式

python 复制代码
element = WebDriverWait(chromedriver, timeout=10).until(lambda d: d.find_element(By.ID, "tree-input"))

利用树形结构

有时候,我们定位一个元素,往往会有多个重复的元素

我们可以先获取他的祖先元素,在祖先元素的基础上,再进行获取!

python 复制代码
chromedriver.find_element(By.ID, 'colid-1934886344377413').find_element(By.CLASS_NAME, "suffix-group")

iframe的问题

网页中的iframe(内联框架)是页面中嵌套的独立文档。

在Selenium中,要与iframe中的元素进行交互,需要先切换到iframe上下文,然后才能执行操作。

定位iframe元素

python 复制代码
iframe = driver.find_element_by_xpath("//iframe[@id='frame_id']")

切换到iframe上下文

python 复制代码
driver.switch_to.frame(iframe)

执行在iframe中的操作

python 复制代码
element_inside_iframe = driver.find_element_by_xpath("//button[@id='button_inside_iframe']")
element_inside_iframe.click()

切换回默认上下文

python 复制代码
driver.switch_to.default_content()

如果iframe嵌套层级较深,你可能需要多次切换上下文来定位内部的iframe和元素。在处理复杂的页面结构时,建议先仔细分析页面结构,确保准确地切换到所需的iframe上下文。

python 复制代码
dialog_iframe = chromedriver.find_elements(By.TAG_NAME, "iframe")
chromedriver.switch_to.frame(dialog_iframe[4])
相关推荐
jokerest1232 分钟前
pwn——test_your_nc1——测试
开发语言·php
碧海蓝天202214 分钟前
接上一主题,C++14中如何设计类似于std::any,使集合在C++中与Python一样支持任意数据?
开发语言·c++·python
周杰伦fans20 分钟前
Java与C#
java·开发语言·c#
SAP学习成长之路33 分钟前
SAP 零售方案 CAR 系统的介绍与研究
大数据·开发语言·sap·abap·零售·car·bapi
A_Tai233333341 分钟前
MyBatis高级扩展
java·开发语言·mybatis
夏子曦1 小时前
java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC
java·开发语言
Thomas_YXQ1 小时前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d
MYBOYER1 小时前
Kotlin DSL Gradle 指南
android·开发语言·kotlin
武昌库里写JAVA1 小时前
SpringCloud+SpringCloudAlibaba学习笔记
java·开发语言·算法·spring·log4j
夏天吃哈密瓜1 小时前
用Scala来解决成绩排名的相关问题
开发语言·后端·scala