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,'button[type=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属性的元素

前面可以加标签名进行限制;比如div[class='SKnet']:选择所有标签名为div,且class属性值是SKnet的元素。还有.plant[name='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)
按次序选择子节点
相关推荐
惜.己11 小时前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
互联网杂货铺16 小时前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
懒笑翻19 小时前
Python 使用 Selenuim进行自动化点击入门,谷歌驱动,以百度为例
运维·selenium·自动化
go_to_hacker20 小时前
容器安全检测和渗透测试工具
测试工具·安全
惜.己21 小时前
Jmeter中的断言(四)
测试工具·jmeter·1024程序员节
半桶水专家1 天前
tcpdump抓取流量包详解
网络·测试工具·tcpdump
小流年 °1 天前
抓包工具Wireshark
网络·测试工具·wireshark
qq_433716951 天前
Selenium+Pytest自动化测试框架 ------ 禅道实战
自动化测试·软件测试·selenium·单元测试·pytest·接口测试·压力测试
LucianaiB2 天前
丹摩|丹摩助力selenium实现大麦网抢票
selenium·测试工具