站点访问出现白屏

  • 浏览器的版本与自动化所需的驱动(如 chromedriver)是否一致
  • 当版本一致时,可以在自动访问站点后,调用一次“刷新”方法refresh()

    找元素报错,但在控制台却正常

  • 改用 Xpath 获取

    当元素在界面不可见时

    1. def scroll_to_target(self, web_element):
    2. """用于浏览器内滚动元素到可视窗口以定位元素"""
    3. try:
    4. (self.driver.execute_script("arguments[0].scrollIntoView();", web_element))
    5. time.sleep(1)
    6. except:
    7. raise

    获取当前页签的 URL

    1. # 通过 debug 查看具体的属性
    2. instance_webdriver.switch_to.active_element.parent.current_url

    image.png

    当出现错误 Message: element not interactable

    原因很多,包括但不限于元素漂移、重绘、hover等
    人工检查代码执行时,测试对象的交互表现,可以解决的方式包括

  • 增加适当的休眠函数(比如以此等待界面瞬时的重绘完成)

  • 以某种方式(如move_to_element)确定对象可见
  • 在页面加载后,调用页面刷新方法(比如可以清除偏移)

    canvas的处理

    以及offset()方法的缺陷

  • canvas 是位图,并不提供任何已经绘制在上面的对象的信息。所以只能通过 JS 或者模拟鼠标在屏幕上的坐标操作等实现画图,通过坐标系操作时,计算机不能有多屏接入。见https://www.w3school.com.cn/jsref/dom_obj_canvas.asp


坐标系操作的缺陷
# GitHub Issue
# https://github.com/SeleniumHQ/selenium/issues/10617
# https://github.com/webdriverio/webdriverio/issues/6596
# https://github.com/w3c/webdriver/issues/1488
# https://github.com/SeleniumHQ/selenium/issues/8003 offsetissue.mov (4.22MB)```python def get_node_right_panel(browser, x_offset=320, y_offset=320): _cv = browser.find_element(By.XPATH, “//canvas”) browser.move_by_offset(x_offset, y_offset) _cv.click() try: assert browser.find_element(DesignDom.ACTFLOW_RIGHT_PANEL[0], DesignDom.ACTFLOW_RIGHT_PANEL[1]), “动作流页右侧面板打开了” except Exception: raise Exception(“画布上的对应坐标系没有对象”)

def add_link_on_canvas(browser, src_xoffset: int | float, src_yoffset: int | float, dst_xoffset: int | float, dst_yoffset: int | float): “””

  1. :param browser:
  2. :param src_xoffset:
  3. :param src_yoffset:
  4. :param dst_xoffset:
  5. :param dst_yoffset:
  6. :return:
  7. """
  8. _cv = browser.find_element(By.XPATH, "//canvas")
  9. browser.move_by_offset(src_xoffset, src_yoffset)
  10. browser.click_and_hold(_cv)
  11. browser.drag_and_drop_by_offset(_cv, dst_xoffset, dst_yoffset)
  12. browser.reset_actions()

```

canvas 业务自动化问题的解决方案

  • 开发侧提供 hook,挂载到 window 对象;再由自动化代码调用 js 以访问相应的 hook API

键盘输入的问题

  • 当输入有重叠、截断等不符合预期的异常:先 clear(),再 send_keys()

image.png

  • 输入值后需要通过回车键触发的,形如 send_keys(('str_value', Keys.ENTER))。具体可查阅相关 API

image.png

选中(点击)对象后不符合预期

  • 确定是否可见可交互(Interacable)
  • 观察自动化运行时的对象表现,是否测试对象或页面有瞬间的重绘现象。可以合理的调用点击频次

image.png