63.Selenium框架

Selenium框架

【一】浏览器操作

1)页面操作

1.初始化浏览器对象

# 使用环境变量
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Chrome(path)
browser.close()	# 关闭浏览器

# 使用绝对路径
from selenium.webdriver.chrome.service import Service
from selenium import webdriver

service = Service(executable_path="./chromedriver.exe")
browser = webdriver.Chrome(service=service)
browser.get("https://www.jd.com")
browser.close()

2.访问页面

from selenium import webdriver

browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com/')
browser.close()
类型 功能 代码
设置浏览器大小 设置分辨率 500*500 browser.set_window_size(500, 500)
设置浏览器大小:全屏 browser.maximize_window()
前进后退 后退 browser.back()
前进 browser.forward()
获取页面基础属性 网页标题 print(browser.title)
当前网址 print(browser.current_url)
浏览器名称 print(browser.name)
网页源码 print(browser.page_source)

3.切换选项卡

from selenium import webdriver
import time

# 创建 Chrome 浏览器的实例
browser = webdriver.Chrome()
# 打开百度网页
browser.get('https://www.baidu.com/')
# 隐式等待2秒,确保页面加载完全
browser.implicitly_wait(2)
# 打印当前窗口句柄
print(browser.window_handles)
# 在当前浏览器实例中新开一个选项卡
browser.execute_script('window.open()')
# 获取所有选项卡的句柄列表
all_handles = browser.window_handles
# 切换到第二个选项卡(下标为1)
browser.switch_to.window(all_handles[1])
# 在第二个选项卡中打开淘宝网页
browser.get('http://www.taobao.com')
# 等待2秒
time.sleep(2)
# 切换回第一个选项卡(下标为0)
browser.switch_to.window(all_handles[0])
# 在第一个选项卡中打开hao123网页
browser.get('http://www.hao123.com')
# 等待2秒
time.sleep(2)
# 关闭当前选项卡
browser.close()
# 关闭浏览器实例
browser.quit()

2)八大选择器

属性 函数
CLASS find_element(by=By.CLASS_NAME, value=‘’)
XPATH find_element(by=By.XPATH, value=‘’)
LINK_TEXT find_element(by=By.LINK_TEXT, value=‘’)
PARTIAL_LINK_TEXT find_element(by=By.PARTIAL_LINK_TEXT, value=‘’)
TAG find_element(by=By.TAG_NAME, value=‘’)
CSS find_element(by=By.CSS_SELECTOR, value=‘’)
ID find_element(by=By.ID, value=‘’)

【二】动作链

1)模拟鼠标操作

from selenium.webdriver.common.action_chains import ActionChains
操作 函数
右击 context_click()
双击 double_click()
拖拽 double_and_drop()
悬停 move_to_element()
执行 perform()

2)模拟键盘操作

from selenium.webdriver.common.keys import Keys
操作 函数
删除键 send_keys(Keys.BACK_SPACE)
空格键 send_keys(Keys.SPACE)
制表键 send_keys(Keys.TAB)
回退键 send_keys(Keys.ESCAPE)
回车 send_keys(Keys.ENTER)
全选 send_keys(Keys.CONTRL,‘a’)
复制 send_keys(Keys.CONTRL,‘c’)
剪切 send_keys(Keys.CONTRL,‘x’)
粘贴 send_keys(Keys.CONTRL,‘x’)
键盘F1 send_keys(Keys.F1)

3)示例

from selenium.webdriver.common.keys import Keys
# 输出Python
c.find_element(By.ID,'kw').send_keys('python')
# 回车键
c.find_element(By.ID,'kw').send_keys(Keys.ENTER)
# 点击
c.find_element(By.ID,'kw').click()

【三】执行JS代码

1)滚动到页面底部

import time
from selenium import webdriver

# 初始化WebDriver
browser = webdriver.Chrome()

# 打开京东网页
browser.get('https://www.jd.com/')

# 使用JavaScript执行滚动到页面底部的操作
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

# 等待3秒,以便页面加载完成
time.sleep(3)

2)点击元素

# 使用JavaScript点击一个按钮
element = browser.find_element(By.ID,'button_id')
browser.execute_script('arguments[0].click();', element)

3)输入文本

# 使用JavaScript输入文本到文本框
element = browser.find_element(By.ID,'input_id')
text = 'Hello, World!'
browser.execute_script('arguments[0].value = arguments[1];', element, text)

4)拖动元素

# 使用JavaScript拖动一个可拖动的元素到目标位置
source_element = browser.find_element(By.ID,'source_element_id')
target_element = browser.find_element(By.ID,'target_element_id')
browser.execute_script('''
    var source = arguments[0], target = arguments[1];
    var offsetX = target.getBoundingClientRect().left - source.getBoundingClientRect().left;
    var offsetY = target.getBoundingClientRect().top - source.getBoundingClientRect().top;
    var event = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window });
    source.dispatchEvent(event);
    event = new MouseEvent('mousemove', { bubbles: true, cancelable: true, view: window, clientX: offsetX, clientY: offsetY });
    source.dispatchEvent(event);
    event = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window });
    source.dispatchEvent(event);
''', source_element, target_element)

5)获取元素属性

# 使用JavaScript获取元素的属性值
element = browser.find_element(By.ID,'element_id')
attribute_value = browser.execute_script('return arguments[0].getAttribute("attribute_name");', element)
print(attribute_value)

【四】页面等待

1)强制等待

  • 也叫线程等待, 通过线程休眠的方式完成的等待

    import time
    time.sleep(n)      # 阻塞等待设定的秒数之后再继续往下执行
    

2)显式等待

  • 也称为智能等待,针对指定元素定位指定等待时间

  • 在指定时间范围内进行元素查找,找到元素则直接返回

  • 如果在超时还没有找到元素,则抛出异常

    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    # 设置WebDriver等待时间为最多10秒,每隔0.5秒检查一次
    #每隔 0.5s 检查一次(默认就是 0.5s)
    # 最多等待 10 秒,否则报错。
    #如果定位到元素则直接结束等待
    #如果在10秒结束之后仍未定位到元素则报错
    wait = WebDriverWait(chrome, 10, 0.5)
    
    # 等待页面中的元素"J_goodsList"出现
    wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList'))
    

3)隐式等待

  • 隐式等待设置之后代码中的所有元素定位都会做隐式等待

  • 通过implicitly Wait完成的延时等待,注意这种是针对全局设置的等待

  • 如设置超时时间为10秒,使用了implicitlyWait后

  • 如果第一次没有找到元素,会在10秒之内不断循环去找元素

  • 如果超过10秒还没有找到,则抛出异常

    driver.implicitly_wait(10)    
    # 在指定的n秒内每隔一段时间尝试定位元素,如果n秒结束还未被定位出来则报错
    

【四】无头浏览器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 创建 ChromeOptions 实例
chrome_options = Options()

# 配置 ChromeOptions 的参数

# 指定浏览器分辨率
chrome_options.add_argument('window-size=1920x3000')

# 规避 bug,需要加上这个属性
chrome_options.add_argument('--disable-gpu')

# 隐藏滚动条,应对特殊页面
chrome_options.add_argument('--hide-scrollbars')
chrome_options.add_argument('blink-settings=imagesEnabled=false')

# 不加载图片,提升速度
chrome_options.add_argument('--headless')

# 无头模式,不提供可视化页面。在 Linux 下,如果系统不支持可视化,不加这条会启动失败
# chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

# 手动指定
# 创建 Chrome WebDriver 实例,并传入配置参数
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.baidu.com')  # 打开百度首页

# 在页面源代码中查找关键词 'hao123' 并打印结果
print('hao123' in driver.page_source)
# True

driver.close()  # 关闭浏览器窗口,释放资源
posted on 2024-08-01 10:37  晓雾-Mist  阅读(25)  评论(0)    收藏  举报