Selenium

简单示例:打开百度

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
#创建webdriver实例对象,指明使用的是Chrome浏览器驱动;参数指明浏览器驱动地址;r表示不转义
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )
wd.get('https://www.baidu.com')

input()#闪退因为驱动和浏览器版本不接近

选择元素

根据id属性值来选择元素

from selenium.webdriver.common.by import By

wd.find_element(By.ID,'id值')

返回的是该元素对应的WebElement对象

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )
wd.get('https://www.baidu.com')
element = wd.find_element(By.ID,'kw')
element.send_keys('白月黑羽\n')#包含回车
input()

点击

click()

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )
wd.get('https://www.baidu.com')
element = wd.find_element(By.ID,'kw')
element.send_keys('白月黑羽\n')#包含回车

element = wd.find_element(By.ID,'su')
element.click()
input()

wd.quit() #退出

https://www.byhy.net/cdn2/files/selenium/sample1.html

根据class属性选择元素

wd.find_elements_by_class_name('class名')

find_element和find_elements的区别

find_elements:选择符合条件的所有元素,没有返回空列表

find_element:选择符合条件的第一个元素,没有抛出异常

根据元素标签名选择元素

wd.find_elements_by_tag_name('标签名')

注意selenium4以后wd.find_elements_by*这种写法不赞成;都改成:

from selenium.webdriver.common.by import By

wd.find_element(By.ID, 'username')

wd.find_element(By.CLASS_NAME, 'password')

wd.find_element(By.TAG_NAME, 'input')

wd.find_element(By.CSS_SELECTOR,'buttontype=submit').click()

通过WebElement对象选择元素

与之前的区别,之前是WebDriver对象,它选择的元素的范围是整个Web页面(所有div标签)

而WebElement对象,它选择的元素的范围是该元素的内部(单个div标签)

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')

element = wd.find_element(By.ID,'container')

# 限制 选择元素的范围是 id 为 container 元素的内部。
spans = element.find_elements(By.TAG_NAME, 'span')
for span in spans:
    print(span.text)

等待元素出现

Python中有一个time模块

import time

time.sleep(1) #等待1s中

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
time.sleep(1)
element = wd.find_element(By.ID,'kw')

element.send_keys('通讯')

element = wd.find_element(By.ID,'go')
element.click()

time.sleep(2)
element=wd.find_element(By.ID,'1')
print(element.text)

改写

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
time.sleep(1)
element = wd.find_element(By.ID,'kw')

element.send_keys('通讯')

element = wd.find_element(By.ID,'go')
element.click()

# time.sleep(2)
# element=wd.find_element(By.ID,'1')
# print(element.text)

# 找这个元素,找不到就抛出异常;等1s,再找
while True:
    try:
        element = wd.find_element(By.ID,'1')
        print(element.text)
        break
    except:
        time.sleep(1)

改写"隐式等待"

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.ID,'kw')

element.send_keys('通讯')

element = wd.find_element(By.ID,'go')
element.click()

# 找这个元素,找不到就抛出异常;等1s,再找
# while True:
#     try:
#         element = wd.find_element(By.ID,'1')
#         print(element.text)
#         break
#     except:
#         time.sleep(1)

#Selenium内置解决办法:隐式等待
element = wd.find_element(By.ID,'1')
print(element.text)

操控元素

点击元素

click()

点的是元素正中心

输入框

调用元素WebElement对象的send_keys方法 "element.send_keys()"

输入前,先清除,调用clear方法

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.ID,'kw')
element.send_keys('通讯')

element.clear()

element = wd.find_element(By.ID,'kw')
element.send_keys('科技')
获取元素信息

获取元素的文本内容

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

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

elements = wd.find_elements(By.CLASS_NAME,'animal')
for element in elements:
    print(element.text)
获取元素属性

通过WebElement对象的get_attribute方法来获取元素属性值 eg.element.get_attribute('class')

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CLASS_NAME,'animal')
print(element.get_attribute('class'))
获取整个元素对应的的HTML

获取整个元素对应的HTML文本内容,使用element.get_attribute('outerHTML')

只想要某个元素内部的HTML文本内容,使用element.get_attribute('innerHTML')

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.ID,'1')
print(element.get_attribute('innerHTML'))

<p class="name">包钢股份</p>

<p>代码:<span>600010</span></p>

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/stock1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.ID,'1')
print(element.get_attribute('outerHTML'))

<div class="result-item" id="1">

<p class="name">包钢股份</p>

<p>代码:<span>600010</span></p>

</div>

通过CSS表达式选择元素

CSS选择单个元素

find_element(By.CSS_SELECTOR, CSS Selector参数)

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CSS_SELECTOR,'.animal')
print(element.get_attribute('outerHTML'))
根据tag名选择元素

这里注意:去掉 .;element = wd.find_element(By.CSS_SELECTOR,'animal')

就变成是找标签名为animal 的了

根据id选择元素 ------ #id值
python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CSS_SELECTOR,'#searchtext')
print(element.get_attribute('outerHTML'))
根据class名选择元素 ------ .class值
选择子元素和后代元素

子元素

元素1 > 元素2:元素2是元素1 的直接子元素;最终选择的是元素2;

后代元素

元素1 元素2:中间1个空格或多个空格隔开;最终选择的是元素2;元素2是元素1的后代元素

(元素1 元素2 元素3 元素4 :最终选择的是元素4)

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CSS_SELECTOR,'#container > div')
print(element.text)

内层11

内层12

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CSS_SELECTOR,'#layer1 span')
print(element.text)

内层11

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CSS_SELECTOR,'.plant span')
print(element.text)

土豆

根据其他属性选择

css选择器支持通过任何属性来选择元素(根据属性值),语法是

比如:href

<a href="http://www.miitbeian.gov.cn">苏ICP备88885574号</a>

我要选择这个a元素,可以用href="http://www.miitbeian.gov.cn"

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

element = wd.find_element(By.CSS_SELECTOR,'[href="http://www.miitbeian.gov.cn"]')
print(element.text)

因为有href属性的就一个;所以可以改写成

element = wd.find_element(By.CSS_SELECTOR,'href') #找有href属性的元素

前面可以加标签名进行限制;比如divclass='SKnet':选择所有标签名为div,且class属性值是SKnet的元素。还有.plantname='SKnet' ... ...

这里属性值用单引号、双引号都可以。

两种条件都满足中间加,

比如:选择所有植物和所有的动物

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

from selenium.webdriver.chrome.service import Service
wd = webdriver.Chrome(service= Service(r'E:\chromedriver-win64\chromedriver.exe') )

wd.get('https://www.byhy.net/cdn2/files/selenium/sample1.html')
wd.implicitly_wait(10)#后续所有的定位操作(find_element和find_elements);如果找不到元素,每隔半s再去界面查看一次,直到找到该元素;或者过了10s最大时长为止(参数为最长时间)还没找到就抛异常

elements = wd.find_elements(By.CSS_SELECTOR,'.plant,.animal')

for element in elements:
    print(element.text)
按次序选择子节点
相关推荐
Meta Luo17 小时前
页面改版后自动化用例大量失败,应该怎么维护?
运维·功能测试·测试工具·自动化
释槐鸟~1 天前
还不知道RIDE工具怎么装吗
测试工具·自动化
有技巧搬砖2 天前
为什么锂电池组的电池老化测试很重要?
测试工具·锂电池·电池老化
蒲公英内测分发2 天前
智能手表卖出去后,包装、说明书和官网里的 App 下载入口怎么统一?
前端·人工智能·测试工具·智能家居·智能硬件·智能手表
蒲公英内测分发2 天前
智能手环出海测试,海外合作方分散在不同国家,Android 测试包怎么持续分发和更新?
android·前端·人工智能·测试工具·智能手表
无语的小歪歪2 天前
ATF 智测 1.0
python·测试工具·集成测试
SHENGWEI胜为3 天前
交换机端口显示正常,终端却获取不到 IP 地址?从 DHCP 流程定位故障
服务器·网络·测试工具·缓存·通信工程
xie881018023 天前
长表格跨页重复表头:排版上的做法
测试工具
老孟说禅3 天前
测试工具示波器的使用
测试工具
步行cgn4 天前
为什么使用接口测试工具?
测试工具