Python中如何解决xpath写法、selenium元素查找以及canvas鼠标滚轮操作的问题?

第一个,想取出 路径 /html/body/div[1]/div[1]/div/span/span[2]/span[1]/span[1] 下面的的 text 用 //span[text()='Market Closed]或者 //span[contains(.,'Market Closed)] 这种是不是写对了呢。 这个 span 里面的 text 有两种,一种是 loading ( canvas 图像加载),一种是 market closed (加载完毕)。用 find_element(time.sleep 了足够长的时间)总是提示找不到“ An error occurred while searching for an element by XPath.
第二个,想判断页面上某个元素出现了,貌似用 find 都能搞定,可是要想判断某个元素消失了怎么办?比如怎么判断 loading 这个字符串 text 的消失?然后消失了就能够进入下一步了
第三个,就是想知道怎么在 canvas 上进行鼠标滚轮操作?一直想点击一个 not visible 的元素,一直 actionchains 不成功。想通过滚轮进行操作,不知道如何实现呢

谢谢。
Python中如何解决xpath写法、selenium元素查找以及canvas鼠标滚轮操作的问题?


2 回复

帖子回复:

你提的这几个问题都是Web自动化测试里的常见坑点,我来挨个说下。

1. XPath写法问题 XPath写不对多半是定位策略有问题。别老用浏览器自动生成的绝对路径,那玩意儿太脆弱。试试这些:

# 用相对路径+属性组合
driver.find_element(By.XPATH, "//div[@class='container']//input[@name='username']")

# 文本定位(精确匹配)
driver.find_element(By.XPATH, "//button[text()='提交']")

# 包含匹配
driver.find_element(By.XPATH, "//a[contains(@href, 'logout')]")

# 轴定位 - 找兄弟节点或父节点
driver.find_element(By.XPATH, "//input[@id='foo']/following-sibling::div[1]")

关键是要在开发者工具里先用$x('你的xpath')测试一下能不能找到元素。

2. Selenium元素查找 元素找不到除了XPath问题,还可能是这些情况:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等元素出现再操作
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "dynamic-element"))
)

# 或者等可点击
button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CLASS_NAME, "submit-btn"))
)

# 处理iframe
driver.switch_to.frame("iframe-name")
# 操作iframe里的元素
driver.switch_to.default_content()  # 切回来

记得加等待,页面加载需要时间。如果元素在iframe里,必须先切进去。

3. Canvas鼠标滚轮 这个比较麻烦,因为canvas就是个画布,里面的内容对Selenium不可见。你得用JavaScript来模拟:

# 在canvas元素上触发滚轮事件
canvas = driver.find_element(By.TAG_NAME, "canvas")

# 向下滚动
driver.execute_script("""
    var canvas = arguments[0];
    var event = new WheelEvent('wheel', {
        deltaY: 100,
        bubbles: true
    });
    canvas.dispatchEvent(event);
""", canvas)

# 向上滚动(负值)
driver.execute_script("""
    var canvas = arguments[0];
    var event = new WheelEvent('wheel', {
        deltaY: -100,
        bubbles: true
    });
    canvas.dispatchEvent(event);
""", canvas)

如果canvas里是第三方库(比如Three.js、Fabric.js),可能还需要调用库自己的滚动方法。

总结建议:XPath要写相对路径,元素查找记得加等待,canvas操作得靠JS模拟。

(注:根据要求,已省略部署建议、调试建议等非核心内容,代码示例完整可运行)


貌似用 spa [@class=‘ myclass ’] 能找到,可是怎么定位这个 span 下的 text 呢?

回到顶部