Selenium对React页面鼠标弹出层的测试

2022-02-18  本文已影响0人  劉小乙

问题描述

要实现鼠标指针覆盖到指定的DIV元素后会弹出一个新的层,目标要抓取弹出层的内容。

实现思路

0x1 使用selenium自身的Actionchains中的move_to_element() 到元素实现弹出层
elements = self.browser.find_element(By.CSS_SELECTOR,".more_icon")
ActionChains(self.browser).move_to_element(elements).perform()

结果:失败!
因为react本身监听鼠标动作是系统级,而selenium是使用的模拟虚拟的鼠标操作,所以react并不能监听到鼠标的移动,从而数据层上不会产生改变,所以View层不会弹出。

0x2 使用selenium的execute_script(js...)注入js语句操作DOM元素,为元素增加新的mouseover Event
self.browser.execute_script('elements = document.querySelector(\'more_icon\');'
                                'elements.dispatchEvent(new Event("mouseenter"));')

结果:失败!
因为react自身不允许对原生js对Components的Props直接操作!

0x3 使用特殊js脚本注入,实现对react的Components的操作

Github中有个react-trigger-change.js的脚本文件,可以更改react 的Input,checkbox等的状态修改。

结果:失败!
并不能修改Div的状态

0x4 直接操作系统层级的鼠标指针来实现

python中有个pyautogui的库可以实现系统级的鼠标拖拽点按等动作。
那么我们怎么确定DIV的位置呢?

import pyautogui
try:
  while True:
      x, y = pyautogui.position()
         time.sleep(1)
          print(x, y)
except KeyboardInterrupt:
         print('\nExit.')
544,499

将鼠标移动到目标div上,显示出的值即实际屏幕中div的XY的值
c.selenium中增加鼠标移动并停留即可

pyautogui.moveTo(544,499,duration=1)  #duration指鼠标移动速度
time.sleep(1)

结束

至此我们终于可以获得react页面中的信息,要注意的react对鼠标移动的监听层级,selenium虽好但是还是需要一些其他的辅助手段才能获取我们需要的内容。

上一篇 下一篇

猜你喜欢

热点阅读