browsergym-workarena 0.1.0rc4__tar.gz → 0.1.0rc5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/PKG-INFO +4 -4
  2. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/README.md +1 -1
  3. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/requirements.txt +1 -1
  4. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/__init__.py +1 -1
  5. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/config.py +9 -2
  6. browsergym_workarena-0.1.0rc5/src/browsergym/workarena/data_files/setup_files/expected_user_columns.json +59 -0
  7. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/install.py +60 -1
  8. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/knowledge.py +1 -1
  9. browsergym_workarena-0.1.0rc4/banner.png +0 -0
  10. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/.github/workflows/pypi.yml +0 -0
  11. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/LICENSE +0 -0
  12. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/pyproject.toml +0 -0
  13. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5/scripts}/generate_knowledge_base.ipynb +0 -0
  14. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/api/__init__.py +0 -0
  15. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/api/requests.py +0 -0
  16. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/api/utils.py +0 -0
  17. {browsergym_workarena-0.1.0rc4/src/browsergym/workarena/data_files → browsergym_workarena-0.1.0rc5/src/browsergym/workarena/data_files/setup_files}/kb_autopublish_workflow.xml +0 -0
  18. {browsergym_workarena-0.1.0rc4/src/browsergym/workarena/data_files → browsergym_workarena-0.1.0rc5/src/browsergym/workarena/data_files/setup_files}/knowledge_base.json +0 -0
  19. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/all_menu.json +0 -0
  20. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/create_change_request_task.json +0 -0
  21. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/create_hardware_asset_task.json +0 -0
  22. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/create_incident_task.json +0 -0
  23. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/create_problem_task.json +0 -0
  24. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/create_user_task.json +0 -0
  25. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/filter_asset_list_task.json +0 -0
  26. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/filter_change_request_list_task.json +0 -0
  27. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/filter_hardware_list_task.json +0 -0
  28. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/filter_incident_list_task.json +0 -0
  29. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +0 -0
  30. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/filter_user_list_task.json +0 -0
  31. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/impersonation_users.json +0 -0
  32. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/knowledge_base_configs.json +0 -0
  33. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_apple_mac_book_pro15_task.json +0 -0
  34. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_apple_watch_task.json +0 -0
  35. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_developer_laptop_task.json +0 -0
  36. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_development_laptop_pc_task.json +0 -0
  37. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_ipad_mini_task.json +0 -0
  38. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json +0 -0
  39. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json +0 -0
  40. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json +0 -0
  41. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json +0 -0
  42. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/sort_asset_list_task.json +0 -0
  43. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json +0 -0
  44. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json +0 -0
  45. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/sort_incident_list_task.json +0 -0
  46. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/sort_service_catalog_item_list_task.json +0 -0
  47. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/data_files/task_configs/sort_user_list_task.json +0 -0
  48. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/instance.py +0 -0
  49. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/__init__.py +0 -0
  50. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/base.py +0 -0
  51. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/form.py +0 -0
  52. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/list.py +0 -0
  53. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/navigation.py +0 -0
  54. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/README.md +0 -0
  55. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/extract_all_menu_items.py +0 -0
  56. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/generate_forms.py +0 -0
  57. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/knowledge.py +0 -0
  58. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/list.py +0 -0
  59. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/navigation.py +0 -0
  60. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/service_catalog.py +0 -0
  61. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/scripts/validate.py +0 -0
  62. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/service_catalog.py +0 -0
  63. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/utils/__init__.py +0 -0
  64. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/utils/debug.py +0 -0
  65. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/utils/form.py +0 -0
  66. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/tasks/utils/js_utils.js +0 -0
  67. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/src/browsergym/workarena/utils.py +0 -0
  68. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_random_config_generation.py +0 -0
  69. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_snow_instance.py +0 -0
  70. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_task_from_config.py +0 -0
  71. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_task_general.py +0 -0
  72. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_task_setup.py +0 -0
  73. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_utils.py +0 -0
  74. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/test_validate.py +0 -0
  75. {browsergym_workarena-0.1.0rc4 → browsergym_workarena-0.1.0rc5}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: browsergym-workarena
3
- Version: 0.1.0rc4
3
+ Version: 0.1.0rc5
4
4
  Summary: WorkArena benchmark for BrowserGym
5
5
  Project-URL: homepage, https://github.com/ServiceNow/WorkArena
6
6
  Author: Léo Boisvert, Alex Drouin, Maxime Gasse, Alex Lacoste, Manuel Del Verme
@@ -13,7 +13,7 @@ Classifier: Operating System :: OS Independent
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
15
  Requires-Python: >3.7
16
- Requires-Dist: browsergym-core==0.1.0rc4
16
+ Requires-Dist: browsergym-core==0.1.0rc5
17
17
  Requires-Dist: english-words>=2.0.1
18
18
  Requires-Dist: numpy>=1.14
19
19
  Requires-Dist: requests>=2.31
@@ -78,7 +78,7 @@ To setup WorkArena, you will need to get your own ServiceNow instance, install o
78
78
  ### a) Create a ServiceNow Developer Instance
79
79
 
80
80
  1. Go to https://developer.servicenow.com/ and create an account.
81
- 2. Click on `Request an instance` and select the `Vancouver` release (initializing the instance will take a few minutes)
81
+ 2. Click on `Request an instance` and select the `Utah` release (initializing the instance will take a few minutes)
82
82
  3. Once the instance is ready, click _Return to the Developer Portal_, then navigate to _Manage instance password_ and click _Reset instance password_.
83
83
  4. You should now see your URL and credentials. Based on this information, set the following environment variables:
84
84
  * `SNOW_INSTANCE_URL`: The URL of your ServiceNow developer instance
@@ -56,7 +56,7 @@ To setup WorkArena, you will need to get your own ServiceNow instance, install o
56
56
  ### a) Create a ServiceNow Developer Instance
57
57
 
58
58
  1. Go to https://developer.servicenow.com/ and create an account.
59
- 2. Click on `Request an instance` and select the `Vancouver` release (initializing the instance will take a few minutes)
59
+ 2. Click on `Request an instance` and select the `Utah` release (initializing the instance will take a few minutes)
60
60
  3. Once the instance is ready, click _Return to the Developer Portal_, then navigate to _Manage instance password_ and click _Reset instance password_.
61
61
  4. You should now see your URL and credentials. Based on this information, set the following environment variables:
62
62
  * `SNOW_INSTANCE_URL`: The URL of your ServiceNow developer instance
@@ -1,4 +1,4 @@
1
- browsergym-core==0.1.0rc4
1
+ browsergym-core==0.1.0rc5
2
2
  english-words>=2.0.1
3
3
  numpy>=1.14
4
4
  requests>=2.31
@@ -1,4 +1,4 @@
1
- __version__ = "0.1.0rc4"
1
+ __version__ = "0.1.0rc5"
2
2
 
3
3
  from browsergym.core.registration import register_task
4
4
 
@@ -51,7 +51,7 @@ ORDER_LOANER_LAPTOP_TASK_CONFIG_PATH = str(
51
51
 
52
52
  # Knowledge base that is included with the benchmark
53
53
  KB_NAME = "General Knowledge"
54
- KB_FILEPATH = str(resources.files(data_files).joinpath("knowledge_base.json"))
54
+ KB_FILEPATH = str(resources.files(data_files).joinpath("setup_files/knowledge_base.json"))
55
55
 
56
56
  # Form tasks
57
57
  CREATE_CHANGE_REQUEST_CONFIG_PATH = str(
@@ -112,6 +112,13 @@ SORT_USER_LIST_CONFIG_PATH = str(
112
112
  WORKFLOWS = {
113
113
  "kb_publish": {
114
114
  "name": "WorkArena Auto-Publish",
115
- "update_set": str(resources.files(data_files).joinpath("kb_autopublish_workflow.xml")),
115
+ "update_set": str(
116
+ resources.files(data_files).joinpath("setup_files/kb_autopublish_workflow.xml")
117
+ ),
116
118
  }
117
119
  }
120
+
121
+ # Number of columns in the user list; used for setup
122
+ EXPECTED_USER_COLUMNS_PATH = str(
123
+ resources.files(data_files).joinpath("setup_files/expected_user_columns.json")
124
+ )
@@ -0,0 +1,59 @@
1
+ [
2
+ "user_name",
3
+ "name",
4
+ "email",
5
+ "active",
6
+ "sys_created_on",
7
+ "sys_updated_on",
8
+ "avatar",
9
+ "building",
10
+ "phone",
11
+ "calendar_integration",
12
+ "city",
13
+ "sys_class_name",
14
+ "company",
15
+ "cost_center",
16
+ "country",
17
+ "sys_created_by",
18
+ "date_format",
19
+ "default_perspective",
20
+ "department",
21
+ "sys_domain",
22
+ "sys_domain_path",
23
+ "employee_number",
24
+ "enable_multifactor_authn",
25
+ "failed_attempts",
26
+ "first_name",
27
+ "gender",
28
+ "home_phone",
29
+ "internal_integration_user",
30
+ "ldap_server",
31
+ "preferred_language",
32
+ "last_login",
33
+ "last_login_time",
34
+ "last_name",
35
+ "location",
36
+ "locked_out",
37
+ "manager",
38
+ "middle_name",
39
+ "mobile_phone",
40
+ "notification",
41
+ "user_password",
42
+ "password_needs_reset",
43
+ "photo",
44
+ "introduction",
45
+ "roles",
46
+ "schedule",
47
+ "source",
48
+ "state",
49
+ "street",
50
+ "sys_tags",
51
+ "time_format",
52
+ "time_zone",
53
+ "title",
54
+ "sys_updated_by",
55
+ "sys_mod_count",
56
+ "vip",
57
+ "web_service_access_only",
58
+ "zip"
59
+ ]
@@ -6,7 +6,7 @@ import re
6
6
  from playwright.sync_api import sync_playwright
7
7
 
8
8
  from .api.utils import table_api_call
9
- from .config import KB_FILEPATH, KB_NAME, WORKFLOWS
9
+ from .config import KB_FILEPATH, KB_NAME, EXPECTED_USER_COLUMNS_PATH, WORKFLOWS
10
10
  from .instance import SNowInstance
11
11
  from .utils import ui_login
12
12
 
@@ -277,6 +277,60 @@ def install_workflows():
277
277
  browser.close()
278
278
 
279
279
 
280
+ def display_all_columns(url: str):
281
+ """Display all columns in a given list view."""
282
+ with sync_playwright() as playwright:
283
+ instance = SNowInstance()
284
+ browser = playwright.chromium.launch(headless=True, slow_mo=1000)
285
+ page = browser.new_page()
286
+ ui_login(instance, page)
287
+ page.goto(instance.snow_url + url)
288
+ frame = page.wait_for_selector("iframe#gsft_main").content_frame()
289
+ frame.get_by_text("Personalize List").click()
290
+ available_columns = frame.get_by_label("Available")
291
+ available_columns.get_by_role("option").first.click()
292
+ available_columns.get_by_role("option").last.click(modifiers=["Shift"])
293
+ frame.get_by_text("Add").click()
294
+ frame.click("#ok_button")
295
+
296
+
297
+ def check_all_columns_displayed(url: str, expected_columns_path: str):
298
+ """Get the visible columns and checks that all expected columns are displayed."""
299
+ with open(expected_columns_path, "r") as f:
300
+ expected_columns = set(json.load(f))
301
+ with sync_playwright() as playwright:
302
+ instance = SNowInstance()
303
+ browser = playwright.chromium.launch(headless=True, slow_mo=1000)
304
+ page = browser.new_page()
305
+ ui_login(instance, page)
306
+ page.goto(instance.snow_url + url)
307
+ iframe = page.frame("gsft_main")
308
+ lst = iframe.locator("table.data_list_table")
309
+ lst.wait_for()
310
+
311
+ # Validate the number of lists on the page
312
+ lst = lst.nth(0)
313
+ js_selector = f"gsft_main.GlideList2.get('{lst.get_attribute('data-list_id')}')"
314
+ visible_columns = set(page.evaluate(f"{js_selector}.fields").split(","))
315
+
316
+ # check if expected columns is contained in the visible columns
317
+ if not expected_columns.issubset(visible_columns):
318
+ logging.info(
319
+ f"Error setting up list at {url} \n Expected {expected_columns} columns, but got {visible_columns}."
320
+ )
321
+ return False
322
+ logging.info(f"All columns properly displayed for {url}.")
323
+ return True
324
+
325
+
326
+ def setup_list_columns(url: str, expected_columns_path: str):
327
+ """Setup the list view to display the expected number of columns."""
328
+ display_all_columns(url)
329
+ assert check_all_columns_displayed(
330
+ url, expected_columns_path
331
+ ), f"Error setting up list columns at {url}"
332
+
333
+
280
334
  def setup():
281
335
  """
282
336
  Check that WorkArena is installed correctly in the instance.
@@ -285,6 +339,11 @@ def setup():
285
339
  # XXX: Install workflows first because they may automate some downstream installations
286
340
  setup_workflows()
287
341
  setup_knowledge_base()
342
+ # Setup the user list columns by displaying all columns and checking that the expected number are displayed
343
+ setup_list_columns(
344
+ "/now/nav/ui/classic/params/target/sys_user_list.do%3Fsysparm_view%3D%26sysparm_userpref.sys_user_list.view%3D%26sysparm_userpref.sys_user.view%3D%26sysparm_query%3Dactive%253Dtrue%255Ecompany%253D81fd65ecac1d55eb42a426568fc87a63",
345
+ EXPECTED_USER_COLUMNS_PATH,
346
+ )
288
347
 
289
348
 
290
349
  def main():
@@ -33,7 +33,7 @@ class KnowledgeBaseSearchTask(AbstractServiceNowTask):
33
33
  def __init__(self, instance=None, fixed_config: dict = None) -> None:
34
34
  super().__init__(
35
35
  instance=instance,
36
- start_rel_url="/now/nav/ui/classic/params/target/knowledge_home_launcher.do",
36
+ start_rel_url="/now/nav/ui/classic/params/target/%24knowledge.do",
37
37
  )
38
38
 
39
39
  # Load the knowledge base and check its integrity
Binary file