Selenium 滑动验证码处理(二)

在之前的一篇文章里介绍了利用真实鼠标滑动轨迹来绕过滑动验证码的方法,这种方法有个缺点: 采集的轨迹很难覆盖全部的移动距离,最终的移动距离跟目标距离有一定的误差。那么有没有其他的方法呢?

在做动画效果的时候,看着左右不断平移的画面,突然有个想法: 这么顺滑的移动效果能不能用滑验证码呢?

有想法那就试试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private void moveWithInterpolator(WebDriver driver, WebElement element, int distance) {
// 自定义一个插值器, 先加速后减速
Interpolator interpolator = new Interpolator() {
@Override
protected double curve(double t) {
return Math.cos((t + 1) * Math.PI) / 2F + 0.5F;
}
};

Actions actions = new Actions(driver);
// 按住滑块
actions.moveToElement(element);
actions.clickAndHold(element).perform();

IntegerProperty distanceProperty = new SimpleIntegerProperty();
distanceProperty.addListener((ov, oldValue, newValue) -> {
// distanceProperty 的值变化时的回调
int offset = newValue.intValue() - oldValue.intValue();
actions.moveByOffset(offset, 0).perform();
});

// 将 distanceProperty 变化到 distance
KeyValue keyValue = new KeyValue(distanceProperty, distance, interpolator);
KeyFrame keyFrame = new KeyFrame(Duration.millis(250 + distance), e -> {
// 动画结束后释放鼠标
actions.release(element).perform();
}, keyValue);

Timeline timeline = new Timeline(keyFrame);
timeline.play();
}

经过试验,这种方法的成功率也有80%左右,整个流程简化了不少,免去了采集和还原轨迹的步骤,移动距离能全部覆盖到,并且速度较原来的方法有很大的提升。