selenium

一、WEB自动化简介

适合做自动化的项目:(1)软件需求变更不频繁(2)项目周期比较长(3)自动化的脚本能够重复利用。

自动化测试入项:系统测试

自动化测试实现过程:可行性分析,框架的选择(selenium,RF),需求分析、计划、测试用例的设计,无人值守、提交报告。

二、selenium的原理与安装

2.1 selenium简介

Selenium是一套Web网站的程序自动化的解决方案。通过它我们可以写出自动化程序,像人在浏览器中操作web页面一样。比如点击页面按钮,在文本框中输入文字等操作。而且还能从web页面获取信息。比如获取火车、汽车票务信息,招聘网站职位岗位,财经网站股票价格信息等,然后用程序进行分析处理。

Selenium的自动化原理:

2.2 自动化环境安装

安装selenium

Selenium客户端安装命令行:

pip install selenium

如果安装不了可以执行清华大学的源

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

安装chromedriver

google源

http://chromedriver.storage.googleapis.com/index.html

Chrome浏览器

安装Chrome浏览器驱动的网址

https://googlechromelabs.github.io/chrome-for-testing/

选择114 win64版本与浏览器版本适配的webdriver

https://registry.npmmirror.com/binary.html?path=chrome-for-testing/

看浏览器的版本

选择大版本相同的驱动进行下载

下载后解压

2.3 简单示例

写selenium程序查看chromedriver驱动启动

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

wd=webdriver.Chrome(service=Service(r"C:\Users\Downloads\chromedriver_win32\chromedriver.exe"))
input()

运行程序

可以看到服务中已经启动了chromedriver驱动

Selenium简单示例,用chrome浏览器打开https://www.baidu.com

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

wd=webdriver.Chrome(service=Service(r"C:\Users\Downloads\chromedriver_win32\chromedriver.exe"))
wd.get('https://www.baidu.com')
input()

关闭chromedriver日志

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

options=webdriver.ChromeOptions()
options.add_experimental_option(
    'excludeSwitches',['enable-logging']
)
wd=webdriver.Chrome(options=options,service=Service(r"C:\Users\Downloads\chromedriver_win32\chromedriver.exe"))
wd.get('https://www.baidu.com')
input()

三、选择元素的基本方法 

对于百度搜索页面,如果我们想自动化输入柏悦黑羽,就是在网页中,操控界面元素。Web界面自动化,要操纵元素,首先需要选择界面元素,或者说定位界面元素。就是先告诉浏览器,你要操作哪个界面元素,让它找到你要操作的界面元素。我们必须要先让浏览器先找到元素,然后才能操作元素。

3.1 根据ID属性选择元素

我们可以把id想象成元素的编号,是用来在html中标记元素的。根据规范,如果元素有id属性,这个id必须是当前html中唯一的。所以,如果元素有id,这个id必须是当前html中唯一的,所以如果元素有id,根据id选择元素是最简单高效的方式。

访问百度,并搜索通讯相关消息

selenium_test1.py

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

#创建webDriver对象
wd=webdriver.Chrome()
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'kw')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
element.send_keys("通讯\n")
pass

这里返回的是一个WebElement对象

如果根据传入的ID,找不到这样的元素,find_element方法就会抛出selenium.common.exceptions.NoSuchElementException异常。

更改程序传入一个不存在的id

selenium_test1.py

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

#创建webDriver对象
wd=webdriver.Chrome()
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'kw1')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
element.send_keys("通讯\n")
pass

使用点击搜索

selenium_test1.py

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

#创建webDriver对象
wd=webdriver.Chrome()
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
element1.send_keys("通讯\n")
element2=wd.find_element(By.ID,'su')
element2.click()
wd.quit()

3.2 根据class属性、tag名选择元素

根据class属性选择元素

Web自动化的难点和重点之一,就是如何选择我们想要操作的web页面元素。除了根据元素的id,我们还可以根据元素的class属性选择元素。

如果想选择指定class属性的元素可以使用find_elements

新建项目

新建1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>

<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
</body>
</html>

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CLASS_NAME,'plant')
elements2=wd.find_elements(By.CLASS_NAME,'animal')
# elements1=wd.find_elements_class_name('plant')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
for elements in elements1:
    print(elements.text)
for elements in elements2:
    print(elements.text)
pass

输出结果:

如果通过class name获取单个webElement对象

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_element(By.CLASS_NAME,'plant')
elements2=wd.find_element(By.CLASS_NAME,'animal')
# elements1=wd.find_elements_class_name('plant')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
print(elements1.text)
print(elements2.text)
pass

输出结果:

find_element和find_elements的区别

使用find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,返回空列表

使用find_element选择的是符合条件的第一个元素,如果没有符合条件的元素,抛出异常。

查找没有符合条件的元素

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_element(By.CLASS_NAME,'plant1')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
print(elements1.text)
pass

 会产生如下错误:

根据tag名选择元素

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.TAG_NAME,'div')
# 通过该webElement对象,就可以对页面元素进行操作了
# 比如输入字符串
for elements in elements1:
    print(elements.text)
pass

运行结果如下:

3.3 通过WebElement对象选择元素

不仅WebDriver对象有选择元素的方法,WebElement对象也有选择元素的方法。WebElement对象也可以调用find_elements_by_xxx、find_element_by_xxx之类的方法。

WebDriver对象选择元素范围是整个Web页面,而WebElement对象选择的范围是该元素的内部。

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div id="inner11"><span>内层11</span></div>
        <div id="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div id="inner21"><span>内层21</span></div>
        <div id="inner22"><span>内层22</span></div>
    </div>
</div>
</body>
</html>

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
#根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'container')
# 限制 选择元素的范围是id 为container 内部的内容
spans=element.find_elements(By.TAG_NAME,"span")
# 比如输入字符串
for span in spans:
    print(span.text)
pass

3.4 等待元素出现

当发现元素没有找到的时候,并不立即返回元素找不到的错误。而是周期性的(每隔半秒钟)重新寻找该元素,直到元素被找到,或者超出指定最大等待时长,这才抛出异常(如果是find_elements之类的方法,则是返回空列表)。

Selenium的Webdriver对象中有个方法叫做implicitly_wait,该方法接收一个参数,用来指定最大等待时长。加入后后续的所有find_element或者find_elements之类的方法调用都会采用上面的策略。如果找不到元素每隔半秒再去界面上查看一次,直到找到了该元素,或者过了10S最大时长。

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element=wd.find_element(By.ID,'container')
# 限制 选择元素的范围是id 为container 内部的内容
spans=element.find_elements(By.TAG_NAME,"span")
# 比如输入字符串
for span in spans:
    print(span.text)
pass

四、操控元素的基本方法

选择到元素之后,我们的代码会返回元素对应的WebElement对象,通过这个对象,我们就可以操控元素。

操控元素通常包括:

1、 点击元素

2、 在元素中输入字符串,通常是对输入框这样的元素

3、 获取元素包含的信息,比如文本内容,元素的属性

4.1 点击元素

点击元素非常简单,就是调用元素WebElement对象的click方法。当我们调用WebElement对象的click方法去点击元素的时候,浏览器接收到自动化命令,点击的是该元素的中心点位置。

输入框

输入字符串也非常简单,就是调用WebElement对象的send_keys方法。

如果我们要把输入框已经有的内容清除掉,可以使用WebElement对象的clear方法

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
element2=wd.find_element(By.ID,'su')
# 先清除搜索框内容,然后输入海贼王
element1.clear()
element1.send_keys("海贼王")
element2.click()
pass

4.2 获取元素信息

获取元素的文本内容,通过WebElement对象的text属性,可以获取元素展示在界面上的文本内容。

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CLASS_NAME,'animal')
# 获取文本内容
print(element1.text)
pass

 运行结果如下:

4.3 获取元素属性

通过WebElement对象的get_attribute方法来获取元素的属性值。比如要获取元素属性class的值,就可以使用element.get_attribute("class")

selenium_test1.py 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
#创建webDriver对象
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
# 获取属性值
print(element1.get_attribute("maxlength"))
pass

运行结果如下:

执行完自动化代码,如果想要关闭浏览器窗口可以调用WebDriver对象的quit方法。

wd.quit()

4.4 获取元素对应的HTML

要获取整个元素对应的HTML文本内容,可以使用element.get_attribute(“outerHTML”)

如果只是想获取某个元素内部的HTML文本内容,可以使用element.get_attribute(“innerHTML”)

获取整段的HTML代码,使用outerHTML

selenium_test1.py 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
# 获取属性值
print(element1.get_attribute("outerHTML"))
wd.quit()
pass

运行结果:

获取内部HTML,使用innerHTML

selenium_test1.py  

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CLASS_NAME,'s_btn_wr')
# 获取属性值
print(element1.get_attribute("innerHTML"))
wd.quit()
pass

 运行结果:

4.5 获取输入框中的内容

selenium_test1.py   

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("https://www.baidu.com")
# 设置等待时长
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.ID,'kw')
element1.send_keys("海贼王")
# 获取属性值
print(element1.get_attribute("value"))
wd.quit()
pass

 输出结果:

通过WebElement对象的text属性,可以获取元素展示在界面上的文本内容。但是有时候,元素的文本内容没有展示在界面上,或者没有完全展示在界面上。这时,用WebElement对象的text属性获取文本内容会有问题。出现这种情况,可以尝试使用element.get_attribute(‘innerText’)或者element.get_attribute(‘textContent’)

五、CSS选择器

如果我们选择的元素没有id、class属性,或者我们不想选择的元素也有相同的id、class属性值,我们通常可以使用CSS selector语法选择元素。HTML中经常为某种元素指定显示效果,CSS必须告诉浏览器,要选择哪些元素,来使用这样的显示风格。CSS selector语法就是用来选择元素的。

通过CSS Selector选择单个元素的方法是

find_element_by_css_selector(CSS Selector参数)

选择所有元素的方法是

find_elements_by_css_selector(CSS Selector参数)

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .animal{color: red}
    </style>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>

<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div id="inner11"><span>内层11</span></div>
        <div id="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div id="inner21"><span>内层21</span></div>
        <div id="inner22"><span>内层22</span></div>
    </div>
</div>
</body>
</html>

selenium_test1.p  

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,".animal")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass

输出结果如下:

5.1 根据tag名、id、class选择元素

CSS Selector同样可以根据tag名、id属性、class属性来选择元素。根据tag名选择元素的CSS Selector语法非常简单,直接写上tag名即可。

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"span")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass

输出结果:

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_elements(By.CSS_SELECTOR,"span")
# 获取文本内容
for element in element1:
    print(element.get_attribute("innerHTML"))
pass

运行结果:

根据id属性选择元素的语法是在id号前面加上一个#号

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass

运行结果:

5.2 选择子元素和后代元素

HTML中,元素内部可以包含其他元素,比如下面的HTML片段

<div id="container">
    <div id="layer1">
        <div id="inner11"><span>内层11</span></div>
        <div id="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div id="inner21"><span>内层21</span></div>
        <div id="inner22"><span>内层22</span></div>
    </div>
</div>

后代元素也包括了直接子元素,比如id为layer1和layer2的两个div元素,也可以说是id为container的div元素的直接子元素,同时也是后代子元素。

如果元素2是元素1的直接子元素,CSS Selector选择子元素的语法是这样的:

元素1 > 元素2

中间使用>号,最终选择的元素是元素2,并且要求这个元素2是元素1的直接子元素

也支持更多层级的选择

元素1>元素2>元素3>元素4

就是选择元素1里面的子元素元素2里面的子元素元素3里面的子元素元素4

如果元素2是元素1的后代元素,CSS Selector选择后代元素的语法是这样的:

元素1 元素2

最终选择的元素是元素2,并且要求这个元素2是元素1的后代元素。

也支持更多的层级的选择

元素1 元素2 元素3 元素4

最终选择的元素是元素4

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container>div {color: red}
    </style>
</head>
<body>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>

<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div id="inner11"><span>内层11</span></div>
        <div id="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div id="inner21"><span>内层21</span></div>
        <div id="inner22"><span>内层22</span></div>
    </div>
</div>
</body>
</html>

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container>div")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass

运行结果:

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(3)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container div")
# 获取文本内容
print(element1.get_attribute("innerHTML"))
pass

运行结果:

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container>span")
# 获取文本内容
print(element1.get_attribute('outerHTML'))
wd.quit()

运行结果:由于span不是container的直接子元素,所以找不到span

更改Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#container  span")
# 获取文本内容
print(element1.get_attribute('outerHTML'))
wd.quit()

运行结果:

这时候可以找到它的后代元素。

5.3 根据属性选择

CSS选择器支持通过任何属性来选择元素,语法是用一个方括号[]。比如需要选择<a href=”https://www.baidu.com”>百度</a>里面根据href选择,可以使用[href=”https://www.baidu.com”]。这个表达式的意思是,选择属性href值为https://www.baidu.com的元素。

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container>div {color: red}
    </style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
</body>
</html>

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_element(By.CSS_SELECTOR,"[href='https://www.baidu.com']")
# 获取文本内容
print(elements1.get_attribute('innerHTML'))
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements2=wd.find_elements(By.CSS_SELECTOR,"div[class='animal']")
# 获取文本内容
for element2 in elements2:
    print(element2.get_attribute('innerHTML'))
wd.quit()

运行结果:

5.4 选择语法联合使用

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container>div {color: red}
    </style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>

<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
</body>
</html>

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"div > #layer1 .inner11")
# 获取文本内容
print(element1.get_attribute('innerHTML'))
wd.quit()

如果想同时选择属性不同的多个不同元素,可以用,连接不同的属性值

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container>div {color: red}
    </style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>

<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
</body>
</html>

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,".plant,.animal")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果如下:

5.5 选择语法组选择

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
</body>
</html>

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 p,#t1 span")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果为:

5.6 按次序选择子节点

按次序选择子节点,父元素的第n个子节点。我们可以指定选择的元素是父元素的第几个子节点,使用nth-child

span:nth-child(2)

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
<div id="t2">
    <h3>宋词</h3>
    <span>苏轼</span>
    <p>赤壁怀古</p>
    <p>明月几时有</p>
    <p>江城子.乙卯正月二十夜记梦</p>
</div>
</body>
</html>

我们要选择唐诗宋词的第一个作者,也就是第二个子元素。

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"span:nth-child(2)")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果为:

父节点的倒数第n个子节点。也可以反过来,选择的是父元素的倒数第几个子节点,使用nth-last-child

p:nth-last-child(1)

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"p:nth-last-child(1)")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

输出结果如下:

父元素的第几个某类型的子节点。我们可以指定选择的元素是父元素的第几个某类型的子节点,使用nth-of-type。

比如,我们要选择唐诗和宋词的第一个作者,可以选择的是第2个子元素,并且是span类型。

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"span:nth-of-type(1)")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果:

5.7 奇数节点和偶数节点

如果要选择的是父元素的奇数节点,使用nth-child(odd)

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 :nth-child(odd)")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

输出结果:

如果要选择的是父元素的偶数节点,使用nth-child(even)

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 :nth-child(even)")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

输出结果:

输出指定类型的奇数节点

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 p:nth-of-type(even)")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

输出结果:

5.8 兄弟节点选择语法

相邻兄弟节点选择。选择唐诗和宋词的第一个作者可以选择h3后面紧跟的兄弟节点span,这就是一种相邻兄弟关系,可以这样写h3+span,表示元素紧跟关系的是加号

h3+span

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"h3+span")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

输出结果:

如果选择h3后面所有的兄弟节点,使用~

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"h3~span")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果:

如果指定某个div

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#t1 h3~span")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果:

六、Frame 切换/窗口切换

6.1 frame切换

如果使用iframe元素,在其中一个html文档中包含另外的html文档,就得使用Frame切换。这个iframe元素很特殊,在html语法中,frame元素或者iframe元素的内容部会包含一个被嵌入的另一份html文档。

在我们使用selenium打开一个网页是我们的操作范围缺省是当前的html,并不包含嵌入的html文件的内容。如果我们要操作被嵌入的html文档中的元素,就必须切换操作方位到被嵌入的文档中。使用WebDriver对象的switch_to属性。

wd.switch_to.frame(frame_reference)

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
<div id="t2">
    <h3>宋词</h3>
    <span>苏轼</span>
    <p>赤壁怀古</p>
    <p>明月几时有</p>
    <p>江城子.乙卯正月二十夜记梦</p>
</div>
<iframe src="2.html" id="frame1" name="innerFrame">
</iframe>
</body>
</html>

2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #container>div {color: red}
    </style>
</head>
<body>
<a href="https://www.baidu.com">baidu</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>

<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
</body>
</html>

其中,frame_reference可以是frame元素的属性name或者ID

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
wd.switch_to.frame("frame1")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#container")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果:

也可以填写frame所对应的WebElement对象。我们可以根据frame的元素位置或者属性特性,使用find系列的方法,选择到该元素,得到对应的WebElement对象。

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
wd.switch_to.frame(wd.find_element(By.CSS_SELECTOR,'[src="2.html"]'))
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#container")
# elements1=wd.find_elements(By.CSS_SELECTOR,".plant")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.quit()

运行结果:

如果已经切入了内部的iframe框架,想要切回原来的html中,可以通过如下代码:

wd.switch_to.default_content()

selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(10)
wd.switch_to.frame(wd.find_element(By.CSS_SELECTOR,'[src="2.html"]'))
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#container")
# elements1=wd.find_elements(By.CSS_SELECTOR,".plant")
# 获取文本内容
for element1 in elements1:
    print(element1.get_attribute('innerHTML'))
wd.switch_to.default_content()
element2=wd.find_element(By.CSS_SELECTOR,"#t1")
print(element2.text)
wd.quit()

运行结果:

6.2 切换到新的窗口

在网页上操作的时候,我们经常遇到,点击一个链接或者按钮,就会打开一个新窗口。如果我们要到新窗口操作,可以使用Webdriver对象的switch_to属性的window方法

wd.switch_to.window(handle)

参数handle需要传入什么参数,WebDriver对象有window_handles属性,这是一个列表对象,里面包括了当前浏览器里面所有的窗口句柄。句柄就是对应网页窗口的一个ID。

Selenium_test1.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
wd.implicitly_wait(30)
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"[href='https://www.baidu.com']")
element1.click()
for handle in wd.window_handles:
    wd.switch_to.window(handle)
    if '百度' in wd.title:
        wd.find_element(By.ID,"kw").send_keys('截拳道')
        element2=wd.find_element(By.ID,'su')
        element2.click()
    break
wd.quit()

上面代码的用意就是,依次获取wd.window_handles里面的所有句柄对象,并且调用wd.switch_to.window(handle)方法,切入到每个窗口。然后检查里面该窗口对象的属性(可以是标题栏、地址栏),判断是不是我们要操作的那个窗口,如果是,就跳出循环。

如果我们在新窗口操作结束后,还要回到原来的窗口,我们仍然可以使用上面的方法,依次切入窗口,然后根据标题栏之类的属性进行判断。

或者

因为我们一开始就在原来的窗口里面,我们知道进入新窗口操作完后,还需要再切回来,可以事先保存该老窗口的句柄,使用下面的方法

#mainWindow变量保存当前窗口的句柄
mainWindow=wd.current_window_handle

切换到新窗口操作完后,可以直接将driver对应的对象返回原来的窗口

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/1.html")
mainWindow=wd.current_window_handle
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"[href='https://www.baidu.com']")
element1.click()
time.sleep(3)
for handle in wd.window_handles:
    wd.switch_to.window(handle)
    time.sleep(3)
    if '百度' in wd.title:
        break
wd.find_element(By.ID,"kw").send_keys('截拳道')
time.sleep(3)
wd.switch_to.window(mainWindow)
time.sleep(3)
wd.find_element(By.ID,'clickme').click()

七、输入框和选择框

选择框

radio框

radio框,直接使用WebElement的click方法,模拟用户点击就可以了。

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<div id="s_radio">
    <input type="radio" name="teacher" value="小江老师">小江老师
    <br>
    <input type="radio" name="teacher" value="小雷老师">小雷老师
    <br>
    <input type="radio" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
</body>
</html>

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"#s_radio input[checked=checked]")
print("当前选中的是:"+element1.get_attribute('value'))
time.sleep(10)
element2=wd.find_element(By.CSS_SELECTOR,"#s_radio input[value='小雷老师']")
element2.click()
time.sleep(10)
print("当前选中的是:"+element2.get_attribute('value'))

checkbox框

对checkbox进行选择,也是直接用WebElement的click方法,模拟用户点击选择。需要注意的是,要选中checkbox的一个选项,必须先获取当前该复选框的状态,如果该选项已经勾选了,就不能够点击,否则反而会取消选择。先把已经选中的选项全部点击一下,确保都是未选择状态。再选择需要选择的。

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<div id="s_checkbox">
    <input type="checkbox" name="teacher" value="小江老师">小江老师
    <br>
    <input type="checkbox" name="teacher" value="小雷老师">小雷老师
    <br>
    <input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
</body>
</html>

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,"#s_checkbox input[checked=checked]")
time.sleep(10)
for element1 in elements1:
    element1.click()
time.sleep(10)
element2=wd.find_element(By.CSS_SELECTOR,"#s_checkbox input[value='小雷老师']")
element2.click()
time.sleep(10)
print("当前选中的是:"+element2.get_attribute('value'))

select框

radio框以及checkbox框都是input元素,只是里面的type不同而已。select框则是一个新的select标签,对于select选择框,selenium专门提供了一个select类进行操作。

Select类提供了如下的方法

根据选择的value属性值,选择元素。

select_by_value

根据选项的次序(从1开始),选择元素

select_by_index

根据选项的可见文本,选择元素

select_by_visible_text

根据选项的value属性值,去除选中元素

deselect_by_value

根据选择的次序,去除选中元素

deselect_by_index

根据选项的可见文本,去除选中元素

deselect_by_visible_text

Select单选框

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<select id="ss_single">
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>

<select id="ss_multi" multiple>
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>
</body>
</html>

对于select单选框,操作比较简单,不管原来选择的是什么,直接用Select方法选择即可。

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
select1=Select(wd.find_element(By.ID,"ss_single"))
time.sleep(10)
select1.select_by_visible_text("小雷老师")
time.sleep(10)

Select多选框

对于select多选框,要选中某几个选项,要注意去掉原来已经选中的选项。

例如,我们选择示例多选框中的小雷老师和小凯老师。可以用select类的deselect_all方法,清除所有已经选中的选项。然后再通过select_by_visible_text方法选择小雷老师和小凯老师。

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
select1=Select(wd.find_element(By.ID,"ss_multi"))
time.sleep(10)
select1.deselect_all()
select1.select_by_visible_text("小雷老师")
select1.select_by_visible_text("小凯老师")
time.sleep(10)

八、Xpath选择器

Xpath语法简介

Xpath是由国际标准化组织W3C指定的,用来在XML和HTML文档中选择节点的语言。

目前主流浏览器(chrome、firefox、edge、safari)都支持Xpath语法,xpath有1和2两个版本,目前浏览器支持的是xpath1的语法。

Xpath语法中,整个HTML文档根节点用“/”表示,如果我们想选择的是根节点下面的html节点,则可以在搜索框中输入

/html

如果输入下面的表达式

/html/body/div

这个表达式表示选择html下面的body下面的div元素  

自动化程序要使用Xpath来选择web元素,应该调用WebDriver对象的方法find_element_by_xpath或者find_elements_by_xpath

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
select1=Select(wd.find_element(By.XPATH,"//select[@id='ss_multi']"))
time.sleep(10)
select1.deselect_all()
select1.select_by_visible_text("小雷老师")
select1.select_by_visible_text("小凯老师")
time.sleep(10)

绝对路径选择

如果Xpath路径以正斜杠(/)开始,就表示从根节点开始。从根节点开始的路径表达式,就是某元素的绝对路径。/html/body/div等价于css表达式html>body>div。

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"/html/body/div")
for element1 in elements1:
    print(element1.text)
time.sleep(10)

运行结果:

相对路径选择

有时候,我们需要选择web中某一类型的所有web元素,不管它在什么位置。比如,选择页面的所有标签名为div的元素,如果使用CSS表达式,直接写一个div就行了。

在xpath中需要前面加//,表示从当前节点往下寻找所有的后代元素,不管它在什么位置。所以xpath表达式,应该这样写//div

//符号也可以继续加在后面,比如,要选择所有的div元素里面的所有的P元素,不管div在什么位置,也不管p元素在div下面的什么位置,则可以这样写//div//p

对应的自动化程序如下:

elements1=wd.find_elements(By.XPATH,"//div//p")

//表示后代元素,/表示直接子节点

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//body//div//p")
for element1 in elements1:
    print(element1.text)
time.sleep(10)

运行结果:

如果相匹配某标签的所有后代标签,使用*号

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//body//div[@id='t2']//*")
for element1 in elements1:
    print(element1.text)
time.sleep(10)

运行结果:

根据属性选择

Xpath可以根据属性来选择元素。根据属性来选择元素是通过这种格式来的[@属性名='属性值'],注意(1)属性名注意前面有个@(2)属性值一定要用引号,可以是单引号,也可以是双引号

根据id属性选择

选择id为west的元素可以这样

//*[@id='west']

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
<button id="clickme"></button>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
<div id="t2">
    <h3>宋词</h3>
    <span>苏轼</span>
    <p>赤壁怀古</p>
    <p>明月几时有</p>
    <p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
    <input type="radio" name="teacher" value="小江老师">小江老师
    <br>
    <input type="radio" name="teacher" value="小雷老师">小雷老师
    <br>
    <input type="radio" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<div id="s_checkbox">
    <input type="checkbox" name="teacher" value="小江老师">小江老师
    <br>
    <input type="checkbox" name="teacher" value="小雷老师">小雷老师
    <br>
    <input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select id="ss_single">
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>

<select id="ss_multi" multiple>
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
    <p style="color:brown;font-weight: bold">
        城市选择
    </p>
    <div id="china">
        <p id="beijing" class="capital huge-city">
            北京
        </p>
        <p id="shanghai" class="huge-city">
            上海
        </p>
    </div>
    <div id="us">
        <span id="west" style="color: darkgreen">
            <p id="newyork">
                纽约
            </p>
            <p id="huston">
                休斯顿
            </p>
        </span>
    </div>
</div>
</body>
</html>

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//div[@id='us']")
for element1 in elements1:
    print(element1.text)
time.sleep(10)

运行结果:

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[@id='us']")
for element1 in elements1:
    print(element1.text)
time.sleep(10)

运行结果:

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[@id]")
for element1 in elements1:
    print(element1.text)
time.sleep(10)

运行结果如下:这样会选择所有带有id属性的元素

根据class属性选择

选择所有div元素中class为single_choice的元素,可以这样写

//div[@class='single_choice']

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
<button id="clickme"></button>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
<div id="t2">
    <h3>宋词</h3>
    <span>苏轼</span>
    <p>赤壁怀古</p>
    <p>明月几时有</p>
    <p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
    <input type="radio" name="teacher" value="小江老师" class="single_choice">小江老师
    <br>
    <input type="radio" name="teacher" value="小雷老师" class="single_choice">小雷老师
    <br>
    <input type="radio" name="teacher" value="小凯老师" checked="checked" class="single_choice">小凯老师
</div>
<div id="s_checkbox">
    <input type="checkbox" name="teacher" value="小江老师">小江老师
    <br>
    <input type="checkbox" name="teacher" value="小雷老师">小雷老师
    <br>
    <input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select id="ss_single">
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>

<select id="ss_multi" multiple>
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
    <p style="color:brown;font-weight: bold">
        城市选择
    </p>
    <div id="china">
        <p id="beijing" class="capital huge-city">
            北京
        </p>
        <p id="shanghai" class="huge-city">
            上海
        </p>
    </div>
    <div id="us">
        <span id="west" style="color: darkgreen">
            <p id="newyork">
                纽约
            </p>
            <p id="huston">
                休斯顿
            </p>
        </span>
    </div>
</div>
</body>
</html>

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,'//input[@class="single_choice"]')
for element1 in elements1:
    print(element1.get_attribute('value'))
time.sleep(5)

运行结果:

如果一个元素class有多个,如果要选择它,需要写全属性,不可以只写一个属性

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,'//p[@class="capital huge-city"]')
for element1 in elements1:
    print(element1.get_attribute('id'))
time.sleep(5)

运行结果:

@后可以直接加属性值

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,'//select[@multiple]')
for element1 in elements1:
    print(element1.get_attribute('id'))
time.sleep(5)

运行结果:

CSS选择器选择属性值包含某个字符串的元素

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
<button id="clickme"></button>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
<div id="t2">
    <h3>宋词</h3>
    <span>苏轼</span>
    <p>赤壁怀古</p>
    <p>明月几时有</p>
    <p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
    <input type="radio" class="single_choice" name="teacher" value="小江老师"/>小江老师
    <input type="radio" class="single_choice" name="teacher" value="小雷老师"/>小雷老师
    <input type="radio" class="single_choice" name="teacher" value="小凯老师" checked="checked"/>小凯老师
</div>
<div id="s_checkbox">
    <input type="checkbox" name="teacher" value="小江老师">小江老师
    <input type="checkbox" name="teacher" value="小雷老师">小雷老师
    <input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select class="multi-choice" id="ss_single">
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>

<select id="ss_multi" multiple>
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
    <p style="color:brown;font-weight: bold">
        城市选择
    </p>
    <div id="china">
        <p id="beijing" class="capital huge-city">
            北京
        </p>
        <p id="shanghai" class="huge-city">
            上海
        </p>
    </div>
    <div id="us">
        <span id="west" style="color: darkgreen">
            <p id="newyork">
                纽约
            </p>
            <p id="huston">
                休斯顿
            </p>
        </span>
    </div>
</div>
</body>
</html>

比如,要选择a节点,里面的href属性包含了baidu字符串,就可以这样写

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,'a[href*=baidu]')
for element1 in elements1:
    print(element1.get_attribute('href'))
time.sleep(5)

运行结果:

还可以选择属性值以某个字符串开头的元素。比如,要选择a节点,里面的href属性以http开头,就可以这样写

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.CSS_SELECTOR,'a[href^="http"]')
for element1 in elements1:
    print(element1.get_attribute('href'))
time.sleep(5)

还可以选择属性值以某个字符串结尾的元素

属性值包含字符串

3.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选择框</title>
</head>
<body>
<a href="https://www.baidu.com">百度</a>
<div class="plant"><span>土豆</span></div>
<div class="plant"><span>洋葱</span></div>
<div class="plant"><span>白菜</span></div>
<div class="animal"><span>狮子</span></div>
<div class="animal"><span>老虎</span></div>
<div class="animal"><span>山羊</span></div>
<div id="container">
    <div id="layer1">
        <div class="inner11"><span>内层11</span></div>
        <div class="inner12"><span>内层12</span></div>
    </div>
    <div id="layer2">
        <div class="inner21"><span>内层21</span></div>
        <div class="inner22"><span>内层22</span></div>
    </div>
</div>
<button id="clickme"></button>
<div id="t1">
    <h3>唐诗</h3>
    <span>李白</span>
    <p>静夜思</p>
    <span>杜甫</span>
    <p>春夜喜雨</p>
</div>
<div id="t2">
    <h3>宋词</h3>
    <span>苏轼</span>
    <p>赤壁怀古</p>
    <p>明月几时有</p>
    <p>江城子.乙卯正月二十夜记梦</p>
</div>
<div id="s_radio">
    <input type="radio" class="single_choice" name="teacher" value="小江老师"/>小江老师
    <input type="radio" class="single_choice" name="teacher" value="小雷老师"/>小雷老师
    <input type="radio" class="single_choice" name="teacher" value="小凯老师" checked="checked"/>小凯老师
</div>
<div id="s_checkbox">
    <input type="checkbox" name="teacher" value="小江老师">小江老师
    <input type="checkbox" name="teacher" value="小雷老师">小雷老师
    <input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师
</div>
<select class="multi-choice" id="ss_single">
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>

<select id="ss_multi" multiple>
    <option value="小江老师">小江老师</option>
    <option value="小雷老师">小雷老师</option>
    <option value="小凯老师" selected="selected">小凯老师</option>
</select>
<div>
    <p style="color:brown;font-weight: bold">
        城市选择
    </p>
    <div id="china">
        <p id="beijing" class="capital huge-city">
            北京
        </p>
        <p id="shanghai" class="huge-city">
            上海
        </p>
    </div>
    <div id="us">
        <span id="west" style="color: darkgreen">
            <p id="newyork">
                纽约
            </p>
            <p id="huston">
                休斯顿
            </p>
        </span>
    </div>
</div>
</body>
</html>

要选择style属性值包含color字符串的页面元素,可以这样

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[contains(@style, 'color')]")
for element1 in elements1:
    print(element1.get_attribute('style'))
time.sleep(5)

运行结果:

要选择style属性值以color字符串开头的页面元素,可以这样

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/3.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
elements1=wd.find_elements(By.XPATH,"//*[starts-with(@style, 'color')]")
for element1 in elements1:
    print(element1.get_attribute('style'))
time.sleep(5)

运行结果:

要选择style属性值以color字符串结尾的页面元素,可以这样

//*[ends-with(@style, 'color')]

按次序选择

前面学习过的CSS表达式可以根据元素在父节点中的次序选择。

Xpath也可以根据次序选择元素。语法比CSS更简洁,直接在方括号中使用数字表示次序。

某类型第几个子元素。比如,要选择p类型第2个的子元素

//p[2]

注意,选择的是p类型的第2个的子元素,不是第2个子元素,并且是p类型。

再比如,要选取父元素为div中的p类型第2个子元素

//div/p[2]

第几个子元素

也可以选择第2个子元素,不管是什么类型,采用通配符,比如选择父元素为div的第2个子元素,不管是什么类型。

//div/*[2]

倒数第1个子元素

//p[last()]

倒数第2个子元素

//p[last()-1]

范围选择

Xpath还可以选择子元素的次序范围。比如,选择option类型的第1到2个子元素

//option[position()<=2]

或者

//option[position()<3]

 

//*[@class='multi-choice']/option[position()<3]

如果想表示后几个

//*[@class='multi-choice']/option[position()>=last()-2]

组选择和兄弟节点

组选择

CSS有组选择,可以同时使用多个表达式,多个表达式选择的结果都是要选择的元素。CSS组选择,表达式之间用逗号隔开。Xpath也有组选择,使用竖线隔开多个表达式。

比如,要选择所有的option元素和所有的h4元素,可以使用

//option | //h4

等同于CSS选择器

option,h4

再比如,要选择所有的class为single_choice和class为multi_choice的元素,可以使用

//*[@class='single_choice'] | //*[@class='multi_choice']

等同于CSS选择器

.single_choice,.multi_choice

选择父节点

Xpath可以选择父节点,这是CSS做不到的。

某个元素的父节点用/..表示。比如,要选择id为china的节点的父节点,可以这样写//*[@id=’china’]/..,还可以继续向上找上层父节点,比如//*[@id='china']/../../..

兄弟节点选择

相邻兄弟节点选择

Xpath也可以选择后续的兄弟节点,用这样的语法following-sibling::

比如要选择class为single_choice的元素的所有后续兄弟节点

//*[@class=’single_choice’]/following-sibling::*

等同于CSS选择器.single_choice~*

如果,要选择后续节点中的div节点,就应该这样写

//*[@class=’single_choice’]/following-sibling::div

Xpath还可以选择前面的兄弟节点,用这样preceding-sibling::

比如,要选择class为single_choice的元素的所有后续兄弟节点  

//*[@class=’single_choice’]/preceding-sibling::*

而CSS选择器无法选择前面的兄弟节点。

Selenium实战技巧

更多动作,之前我们对web元素的操作主要是选择元素、然后点击元素或者输入字符串,还有其他操作,比如鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等,这些操作可以通过Selenium提供的ActionChains类来实现。

模拟鼠标悬停在百度页面的更多上

Selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.implicitly_wait(3)
wd.get("https://www.baidu.com")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
ac=ActionChains(wd)
#鼠标移动到元素上
ac.move_to_element(
    wd.find_element(By.CSS_SELECTOR,'[name=tj_briicon]')
).perform()
time.sleep(10)

运行结果如下:

冻结界面

有些网站上面的元素,我们的鼠标放在上面会弹出一些内容,比如百度首页的右上角,有个更多产品选项。

如果我们把鼠标放在上面,就会弹出下面的图标。如果我们要用selenium自动化点击图标,就需要F12查看这个元素的特征。

但是我们的鼠标从图标移开后,这个栏目就整个消失了,就没有办法查看对应的HTML。

可以在浏览器的Console中输入如下代码

setTimeout(function(){debugger},5000)

表示在5000ms后,执行debugger命令。执行该命令会使浏览器进入debug状态。Debug状态有个特性,页面被冻住,不管我们怎么点击页面都不会触发事件。

所以,我们可以在输入上面代码并回车执行后,立即鼠标方法页面右上角更多产品处。这个时候就会弹出图标

弹出对话框

有的时候,我们经常会在操作页面的时候,出现一些弹出的对话框。

对话框有三种类型,分别是Alert(警告信息)、Confirm(确认信息)和prompt(提示输入)

Alert

Alert弹出框,目的就是显示通知信息,只需要用户看完信息后,点击OK确定即可。

Name自动化时如何模拟用户点击OK按钮呢?

driver.switch_to.alert.accept()

如果程序想要获取弹出对话框中的信息内容,可以通过如下代码:

driver.switch_to.alert.text

4.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对话框、确认框、提示框</title>
</head>
<script type="text/javascript">
  function functionA(){
    alert("一起学习selenium")
  }
  function functionB(){
    confirm("你确定要和我一起学习selenium吗")
  }
  function functionC(){
    prompt("输入你想学习的课程")
  }
</script>
<body>
<input type="button" name="btn1" id="btn1" value="alert" onclick="functionA()">
<input type="button" name="btn2" id="btn2" value="confirm" onclick="functionB()">
<input type="button" name="btn3" id="btn3" value="prompt" onclick="functionC()">

</body>
</html> 

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/4.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"input[name='btn1']")
element1.click()
time.sleep(5)
wd.switch_to.alert.accept()
time.sleep(5)

Confirm

Confirm弹出框,主要是让用户确认是否要进行某个操作。

比如:当管理员在网站上选择删除了某个账号时,就可能弹出confirm弹出框,要求确认是否确定要删除。

Confirm弹出框有两个选择供用户选择,分别是OK和Cancel,分别代表确定和取消操作。

那么,自动化的时候,代码怎么模拟用户点击OK或者Cancel按钮呢?

Selenium提供如下方法进行操作:

如果我们想点击OK按钮,还是用刚才的accept方法,如下:

driver.switch_to.alert.accpet()

如果我们想点击Cancel按钮,可以用dismiss方法,如下:

driver.switch_to.alert.dismiss()

4.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对话框、确认框、提示框</title>
</head>
<script type="text/javascript">
  function functionA(){
    alert("一起学习selenium")
  }
  function functionB(){
    confirm("你确定要和我一起学习selenium吗")
  }
  function functionC(){
    prompt("输入你想学习的课程")
  }
</script>
<body>
<input type="button" name="btn1" id="btn1" value="alert" onclick="functionA()">
<input type="button" name="btn2" id="btn2" value="confirm" onclick="functionB()">
<input type="button" name="btn3" id="btn3" value="prompt" onclick="functionC()">

</body>
</html> 

selenium_test1.py

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/4.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"input[name='btn2']")
element1.click()
time.sleep(5)
wd.switch_to.alert.accept()
time.sleep(5)
element1.click()
time.sleep(5)
wd.switch_to.alert.dismiss()
time.sleep(5)

Prompt

出现Prompt弹出框是需要用户输入一些信息,提交上去。

比如:当管理员在网站上选择给某个账号延期时,就可能会弹出Prompt弹出框,要求输入延期多长时间。

可以调用如下方法

driver.switch_to.alert.send_keys()

selenium_test1.py

wd=webdriver.Chrome(service=Service(r"D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
#调用webService对象的get方法,可以让浏览器打开指定的网址
wd.get("D:/个人知识总结/python project/selenium/4.html")
# 根据id选择元素,返回的就是该元素对应的webElement对象。
element1=wd.find_element(By.CSS_SELECTOR,"input[name='btn3']")
element1.click()
time.sleep(5)
wd.switch_to.alert.send_keys('selenium')
wd.switch_to.alert.accept()
time.sleep(5)
wd.quit()

 

 

posted @ 2024-08-05 11:25  leagueandlegends  阅读(14)  评论(0编辑  收藏  举报