滑动滚动条与处理悬浮元素
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 方法1:使用JavaScript滑动到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 方法2:使用JavaScript滑动到顶部
driver.execute_script("window.scrollTo(0, 0);")
# 方法3:使用键盘操作滑动
body = driver.find_element(By.TAG_NAME, 'body')
body.send_keys(Keys.END) # 滑动到底部
body.send_keys(Keys.HOME) # 滑动到顶部element = driver.find_element(By.ID, "target-element")
# 方法1:使用JavaScript将元素滑动到视图中
driver.execute_script("arguments[0].scrollIntoView();", element)
# 方法2:滑动到元素位置并考虑固定导航栏(偏移量)
header_height = 80 # 假设固定导航栏高度为80px
driver.execute_script(f"window.scrollTo(0, arguments[0].offsetTop-{header_height});", element)# 缓慢滑动到底部(模拟人类操作)
scroll_pause_time = 0.5
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 滑动到当前视窗底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 等待页面加载
time.sleep(scroll_pause_time)
# 计算新的滚动高度并比较
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height# 滑动到水平滚动条的最右侧
driver.execute_script("window.scrollTo(document.body.scrollWidth, 0);")
# 滑动到指定水平位置
driver.execute_script("window.scrollTo(500, 0);") # 向右滑动500pxfrom selenium.webdriver.common.action_chains import ActionChains
# 找到触发悬浮的元素
hover_element = driver.find_element(By.CSS_SELECTOR, ".menu-item")
# 创建ActionChains对象并执行悬浮操作
action = ActionChains(driver)
action.move_to_element(hover_element).perform()
# 现在可以操作悬浮后显示的元素
sub_menu = driver.find_element(By.CSS_SELECTOR, ".sub-menu")
sub_menu.click()# 等待悬浮元素出现
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
hover_trigger = driver.find_element(By.ID, "hover-trigger")
ActionChains(driver).move_to_element(hover_trigger).perform()
# 等待悬浮内容出现
tooltip = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".tooltip-content"))
print(tooltip.text)# 多级悬浮菜单操作
main_menu = driver.find_element(By.ID, "main-menu")
sub_menu_trigger = driver.find_element(By.CSS_SELECTOR, ".has-submenu")
# 先悬浮到主菜单
ActionChains(driver).move_to_element(main_menu).perform()
time.sleep(0.5) # 给动画时间
# 再悬浮到子菜单触发器
ActionChains(driver).move_to_element(sub_menu_trigger).perform()
time.sleep(0.5)
# 最后点击子菜单项
sub_menu_item = driver.find_element(By.CSS_SELECTOR, ".submenu-item")
sub_menu_item.click()# 对于位置固定的悬浮元素,可能需要滚动到特定位置才能触发
target_element = driver.find_element(By.ID, "target")
driver.execute_script("arguments[0].scrollIntoView();", target_element)
# 等待页面稳定
time.sleep(1)
# 然后执行悬浮操作
ActionChains(driver).move_to_element(target_element).perform()# 有时需要将鼠标移出悬浮元素使其消失
hover_element = driver.find_element(By.CLASS_NAME, "hover-me")
ActionChains(driver).move_to_element(hover_element).perform()
# 操作悬浮显示的内容
# ...
# 将鼠标移动到页面左上角(移出悬浮区域)
ActionChains(driver).move_by_offset(-1000, -1000).perform()# 先滑动到元素附近
element = driver.find_element(By.ID, "my-element")
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element)
# 然后执行悬浮操作
ActionChains(driver).move_to_element(element).perform()
# 操作悬浮显示的内容
tooltip = driver.find_element(By.CLASS_NAME, "tooltip")
tooltip.click()# 对于复杂的悬浮面板,可能需要多次移动鼠标
panel_trigger = driver.find_element(By.ID, "panel-trigger")
ActionChains(driver).move_to_element(panel_trigger).perform()
# 在悬浮面板内移动鼠标
panel = driver.find_element(By.ID, "hover-panel")
ActionChains(driver).move_to_element_with_offset(panel, 50, 30).perform()
# 点击面板内的特定元素
panel.find_element(By.LINK_TEXT, "Option 1").click()# 当ActionChains不奏效时,可以直接用JS触发事件
element = driver.find_element(By.CSS_SELECTOR, ".hover-element")
driver.execute_script("""
var event = new MouseEvent('mouseover', {
'view': window,
'bubbles': true,
'cancelable': true
});
arguments[0].dispatchEvent(event);
""", element)# 设置隐式等待避免元素闪烁导致的定位失败
driver.implicitly_wait(5)
# 或者使用显式等待
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".hover-content"))
)# 使用链式操作保持鼠标在元素上
menu = driver.find_element(By.ID, "dropdown")
submenu = driver.find_element(By.CSS_SELECTOR, ".dropdown-content")
ActionChains(driver)\
.move_to_element(menu)\
.move_to_element(submenu)\
.click()\
.perform()# 切换到iframe中处理悬浮元素
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# 执行悬浮操作
hover_element = driver.find_element(By.CLASS_NAME, "hover-in-iframe")
ActionChains(driver).move_to_element(hover_element).perform()
# 操作完成后切回主文档
driver.switch_to.default_content()