test_browsergym_envs.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import json
  2. import pytest
  3. from openhands.core.logger import openhands_logger as logger
  4. from openhands.events.action.browse import BrowseInteractiveAction
  5. from openhands.events.observation.browse import BrowserOutputObservation
  6. from tests.runtime.conftest import _close_test_runtime, _load_runtime
  7. def has_miniwob():
  8. try:
  9. import importlib.util
  10. # try to find this browser environment, if it was installed
  11. spec = importlib.util.find_spec('browsergym.miniwob')
  12. if spec is None:
  13. return False
  14. # try to import this environment
  15. importlib.util.module_from_spec(spec)
  16. return True
  17. except ImportError:
  18. return False
  19. @pytest.mark.skipif(
  20. not has_miniwob(),
  21. reason='Requires browsergym-miniwob package to be installed',
  22. )
  23. def test_browsergym_eval_env(runtime_cls, temp_dir):
  24. runtime = _load_runtime(
  25. temp_dir,
  26. runtime_cls=runtime_cls,
  27. run_as_openhands=False, # need root permission to access file
  28. base_container_image='xingyaoww/od-eval-miniwob:v1.0',
  29. browsergym_eval_env='browsergym/miniwob.choose-list',
  30. force_rebuild_runtime=True,
  31. )
  32. from openhands.runtime.browser.browser_env import (
  33. BROWSER_EVAL_GET_GOAL_ACTION,
  34. BROWSER_EVAL_GET_REWARDS_ACTION,
  35. )
  36. # Test browse
  37. action = BrowseInteractiveAction(browser_actions=BROWSER_EVAL_GET_GOAL_ACTION)
  38. logger.info(action, extra={'msg_type': 'ACTION'})
  39. obs = runtime.run_action(action)
  40. logger.info(obs, extra={'msg_type': 'OBSERVATION'})
  41. assert isinstance(obs, BrowserOutputObservation)
  42. assert not obs.error
  43. assert 'Select' in obs.content
  44. assert 'from the list and click Submit' in obs.content
  45. # Make sure the browser can produce observation in eval env
  46. action = BrowseInteractiveAction(browser_actions='noop()')
  47. logger.info(action, extra={'msg_type': 'ACTION'})
  48. obs = runtime.run_action(action)
  49. logger.info(obs, extra={'msg_type': 'OBSERVATION'})
  50. assert (
  51. obs.url.strip()
  52. == 'file:///miniwob-plusplus/miniwob/html/miniwob/choose-list.html'
  53. )
  54. # Make sure the rewards are working
  55. action = BrowseInteractiveAction(browser_actions=BROWSER_EVAL_GET_REWARDS_ACTION)
  56. logger.info(action, extra={'msg_type': 'ACTION'})
  57. obs = runtime.run_action(action)
  58. logger.info(obs, extra={'msg_type': 'OBSERVATION'})
  59. assert json.loads(obs.content) == [0.0]
  60. _close_test_runtime(runtime)