find_element源码解析
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
ele = driver.find_element('css selector', '.title-content-title')
# find_element源码
def find_element(self, by=By.ID, value=None) -> WebElement:
"""
Find an element given a By strategy [策略] and locator.
:Usage:
::
element = driver.find_element(By.ID, 'foo')
:rtype: WebElement
"""
if isinstance(by, RelativeBy): # 针对相对定位 selenium4.0之后的一个定位方式
elements = self.find_elements(by=by, value=value)
if not elements:
raise NoSuchElementException(f"Cannot locate relative element with: {by.root}")
return elements[0] # 获取元素列表中的第一个元素
# 进一步解析ID,class_name,name本质上还是css定位
if by == By.ID: # 如果by是根据ID则直接替换为[css selector,id=value]的格式
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.CLASS_NAME: # 如果by是根据class name,则直接替换为[css selector,.value]的格式[可以解析为何class='pn vn'时的编写格式为pn.vm]
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME: # 如果by是根据name则直接替换为[css selector,name=value]的格式
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
# tag name的格式与css selector的格式一致,则无需进行转换
return self.execute(Command.FIND_ELEMENT, {
'using': by,
'value': value})['value']
webdriver基础操作
- 获取wendriver的属性和方法(魔术方法除外)
from selenium import webdriver
driver = webdriver.Chrome()
for _ in dir(driver):
if _[0] != "_": # 排除魔术方法
print(_)
- 窗口操作
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 窗口最大化
driver.maximize_window()
# 窗口最小化
driver.minimize_window()
# 全屏
driver.fullscreen_window()
# 设置窗口大小
driver.set_window_size(600, 800)
3.浏览器的属性操作
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 当前网页的url
print(driver.current_url)
# 浏览器的标题
print(driver.title)
# 浏览器的名字
print(driver.name)
# 浏览器的页面源码
print(driver.page_source)
4.浏览器的退出和关闭操作
import time
from selenium import webdriver
driver = webdriver.Chrome()
time.sleep(5)
# 浏览器的退出
driver.quit() # 直接退出浏览器程序,关闭所有标签页
# 浏览器的关闭
driver.close() # 只关闭当前标签页
5.浏览器的前进后退和刷新操作
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://passport.jd.com/")
driver.find_element('css selector', '.style-red').click() # 点击登录
# 浏览器的后退
driver.back()
# 浏览器的前进
driver.forward()
driver.find_element('css selector', "input[id='loginname']").send_keys("admin") # 登录页面输入用户名
time.sleep(5) # 调试作用,方便观察现象
# 浏览器刷新
driver.refresh() # 刷新页面输入的用户名重置
无头浏览器
历史由来:PhantomJS【selenium3.x版本中存在webdriver.PhantomJS(),后期selenium4.0废除】
from selenium import webdriver
myoption = webdriver.ChromeOptions()
# ‘-headless’和'--headless'在chrome中都可以进行使用
myoption.add_argument('--headless')
myoption.add_argument('-headless')
driver = webdriver.Chrome(options=myoption)
driver.get('https://www.baidu.com')
driver.save_screenshot('baidu.png') # 验证浏览器无界面启动
selenium操作绕过登录操作
方式一:
原理: 使用option中的add_argument添加用户数据路径的参数携带用户数据进行登录操作
前提条件:
1.已经登录过一次,存在用户数据
2.运行之前关闭其余浏览器,否则会出现用户数据路径在使用的类似报错信息
# 01 登录一次需要登录的网站
# chrome输入chrome://version/获取个人资料路径【C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default】
# 去掉 Default得到C:\Users\xxx\AppData\Local\Google\Chrome\User Data
from selenium import webdriver
myoption = webdriver.ChromeOptions()
user_data = r'C:\Users\23936\AppData\Local\Google\Chrome\User Data'
myoption.add_argument(f'--user-data-dir={user_data}')
driver = webdriver.Chrome(options=myoption)
driver.get('https://xmind.cn/')