From 3476080ac6d8e8f429e7ca900ae4b732620b957f Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Fri, 12 Dec 2025 16:39:45 -0300 Subject: [PATCH] Update harness and chat tests --- Cargo.lock | 405 +++++++++++++++++++++++++++++++++++++++++++++- PROMPT.md | 4 +- src/harness.rs | 32 +++- tests/e2e/chat.rs | 43 +++-- 4 files changed, 451 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3176fa4..4d288f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -334,6 +334,19 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "atom_syndication" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f68d23e2cb4fd958c705b91a6b4c80ceeaf27a9e11651272a8389d5ce1a4a3" +dependencies = [ + "chrono", + "derive_builder 0.20.2", + "diligent-date-parser", + "never", + "quick-xml 0.37.5", +] + [[package]] name = "atomic" version = "0.6.1" @@ -1037,11 +1050,13 @@ dependencies = [ "reqwest", "rhai", "ring", + "rss", "rust_xlsxwriter", "rustls 0.23.35", "rustls-native-certs 0.6.3", "rustls-pemfile 2.2.0", "scopeguard", + "scraper", "serde", "serde_json", "sha2", @@ -1182,7 +1197,7 @@ dependencies = [ "codepage", "encoding_rs", "log", - "quick-xml", + "quick-xml 0.31.0", "serde", "zip", ] @@ -1535,6 +1550,29 @@ dependencies = [ "typenum", ] +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.111", +] + [[package]] name = "ctr" version = "0.9.2" @@ -1554,6 +1592,16 @@ dependencies = [ "darling_macro 0.14.4", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + [[package]] name = "darling" version = "0.21.3" @@ -1578,6 +1626,20 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.111", +] + [[package]] name = "darling_core" version = "0.21.3" @@ -1603,6 +1665,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.111", +] + [[package]] name = "darling_macro" version = "0.21.3" @@ -1708,7 +1781,16 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" dependencies = [ - "derive_builder_macro", + "derive_builder_macro 0.12.0", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro 0.20.2", ] [[package]] @@ -1723,16 +1805,59 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "derive_builder_macro" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" dependencies = [ - "derive_builder_core", + "derive_builder_core 0.12.0", "syn 1.0.109", ] +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core 0.20.2", + "syn 2.0.111", +] + +[[package]] +name = "derive_more" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.111", +] + [[package]] name = "diesel" version = "2.3.4" @@ -1801,6 +1926,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "diligent-date-parser" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ede7d79366f419921e2e2f67889c12125726692a313bffb474bd5f37a581e9" +dependencies = [ + "chrono", +] + [[package]] name = "dirs" version = "5.0.1" @@ -1881,6 +2015,21 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + [[package]] name = "dunce" version = "1.0.5" @@ -1908,6 +2057,12 @@ dependencies = [ "signature", ] +[[package]] +name = "ego-tree" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8" + [[package]] name = "either" version = "1.15.0" @@ -2169,6 +2324,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + [[package]] name = "futures" version = "0.3.31" @@ -2274,6 +2439,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -2444,6 +2618,16 @@ dependencies = [ "digest", ] +[[package]] +name = "html5ever" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6452c4751a24e1b99c3260d505eaeee76a050573e61f30ac2c924ddc7236f01e" +dependencies = [ + "log", + "markup5ever", +] + [[package]] name = "http" version = "0.2.12" @@ -3069,6 +3253,23 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c3294c4d74d0742910f8c7b466f44dda9eb2d5742c1e430138df290a1e8451c" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + [[package]] name = "matchers" version = "0.2.0" @@ -3223,6 +3424,18 @@ dependencies = [ "tempfile", ] +[[package]] +name = "never" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" @@ -3563,6 +3776,59 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -3678,6 +3944,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -3757,6 +4029,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "encoding_rs", + "memchr", +] + [[package]] name = "quinn" version = "0.11.9" @@ -4109,6 +4391,18 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rss" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2107738f003660f0a91f56fd3e3bd3ab5d918b2ddaf1e1ec2136fb1c46f71bf" +dependencies = [ + "atom_syndication", + "derive_builder 0.20.2", + "never", + "quick-xml 0.37.5", +] + [[package]] name = "rust_xlsxwriter" version = "0.79.4" @@ -4333,6 +4627,21 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scraper" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93cecd86d6259499c844440546d02f55f3e17bd286e529e48d1f9f67e92315cb" +dependencies = [ + "cssparser", + "ego-tree", + "getopts", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + [[package]] name = "sct" version = "0.7.1" @@ -4393,6 +4702,25 @@ dependencies = [ "libc", ] +[[package]] +name = "selectors" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feef350c36147532e1b79ea5c1f3791373e61cbd9a6a2615413b3807bb164fb7" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + [[package]] name = "semver" version = "1.0.27" @@ -4483,6 +4811,15 @@ dependencies = [ "serde", ] +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4569,6 +4906,12 @@ dependencies = [ "time", ] +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.11" @@ -4655,6 +4998,31 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + [[package]] name = "stringprep" version = "0.1.5" @@ -4783,6 +5151,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + [[package]] name = "thin-vec" version = "0.2.14" @@ -5346,6 +5725,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -5430,7 +5815,7 @@ checksum = "f81eb4d9221ca29bad43d4b6871b6d2e7656e1af2cfca624a87e5d17880d831d" dependencies = [ "async-trait", "bytes", - "derive_builder", + "derive_builder 0.12.0", "http 1.4.0", "reqwest", "rustify", @@ -5575,6 +5960,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web_atoms" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd0c322f146d0f8aad130ce6c187953889359584497dac6561204c8e17bb43d" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + [[package]] name = "webdriver" version = "0.50.0" diff --git a/PROMPT.md b/PROMPT.md index aabc8a2..e21dbff 100644 --- a/PROMPT.md +++ b/PROMPT.md @@ -1,6 +1,6 @@ # BotTest Development Prompt -**Version:** 7.0.0 +**Version:** 6.1.0 **Purpose:** Test infrastructure for General Bots ecosystem --- @@ -174,4 +174,4 @@ Never create .md files at: - ✗ Root of botapp/ - ✗ Any project root -All non-PROMPT.md documentation belongs in botbook. \ No newline at end of file +All non-PROMPT.md documentation belongs in botbook. diff --git a/src/harness.rs b/src/harness.rs index d80a38e..cf65c7d 100644 --- a/src/harness.rs +++ b/src/harness.rs @@ -57,6 +57,19 @@ impl TestConfig { } } + /// Auto-install mode: let botserver bootstrap all services + /// No need for pre-installed PostgreSQL binaries + pub fn auto_install() -> Self { + Self { + postgres: false, // Botserver will install PostgreSQL + minio: false, // Botserver will install MinIO + redis: false, // Botserver will install Redis + mock_zitadel: true, + mock_llm: true, + run_migrations: false, // Botserver handles migrations + } + } + pub fn database_only() -> Self { Self { postgres: true, @@ -481,17 +494,21 @@ impl BotServerInstance { // Drive (MinIO) - use SecretsManager fallback env vars .env("DRIVE_ACCESSKEY", "minioadmin") .env("DRIVE_SECRET", "minioadmin") - // Skip service installation during tests - .env("BOTSERVER_SKIP_INSTALL", "1") + // Allow botserver to install services if USE_BOTSERVER_BOOTSTRAP is set + // Otherwise skip installation for faster tests with existing stack + .env("BOTSERVER_SKIP_INSTALL", + if std::env::var("USE_BOTSERVER_BOOTSTRAP").is_ok() { "0" } else { "1" }) .stdout(std::process::Stdio::inherit()) .stderr(std::process::Stdio::inherit()) .spawn() .ok(); if process.is_some() { - log::info!("Waiting for botserver to bootstrap and become ready..."); + // Give more time if using botserver bootstrap (needs to download Vault, PostgreSQL, etc.) + let max_wait = if std::env::var("USE_BOTSERVER_BOOTSTRAP").is_ok() { 600 } else { 120 }; + log::info!("Waiting for botserver to bootstrap and become ready... (max {}s)", max_wait); // Give more time for botserver to bootstrap services - for i in 0..120 { + for i in 0..max_wait { if let Ok(resp) = reqwest::get(&format!("{}/health", url)).await { if resp.status().is_success() { log::info!("Botserver is ready on port {}", port); @@ -714,11 +731,18 @@ impl TestHarness { pub async fn full() -> Result { if std::env::var("USE_EXISTING_STACK").is_ok() { Self::with_existing_stack().await + } else if std::env::var("USE_BOTSERVER_BOOTSTRAP").is_ok() { + Self::setup(TestConfig::auto_install()).await } else { Self::setup(TestConfig::full()).await } } + /// Setup with botserver auto-installing all services + pub async fn with_auto_install() -> Result { + Self::setup(TestConfig::auto_install()).await + } + pub async fn minimal() -> Result { Self::setup(TestConfig::minimal()).await } diff --git a/tests/e2e/chat.rs b/tests/e2e/chat.rs index d7500c5..70936a5 100644 --- a/tests/e2e/chat.rs +++ b/tests/e2e/chat.rs @@ -32,7 +32,7 @@ async fn test_chat_page_loads() { return; } - let chat_input = Locator::css("#chat-input, .chat-input, textarea[placeholder*='message']"); + let chat_input = Locator::css("#messageInput"); match browser.wait_for(chat_input).await { Ok(_) => println!("Chat input found"), @@ -72,12 +72,9 @@ async fn test_chat_widget_elements() { } let elements_to_check = vec![ - ("#chat-container, .chat-container", "chat container"), - ("#chat-input, .chat-input, textarea", "input field"), - ( - "#send-button, .send-button, button[type='submit']", - "send button", - ), + ("#chat-app, .chat-layout", "chat container"), + ("#messageInput", "input field"), + ("#sendBtn", "send button"), ]; for (selector, name) in elements_to_check { @@ -126,7 +123,7 @@ async fn test_send_message() { return; } - let input_locator = Locator::css("#chat-input, .chat-input, textarea"); + let input_locator = Locator::css("#messageInput"); if let Err(e) = browser.wait_for(input_locator.clone()).await { eprintln!("Input not ready: {}", e); ctx.close().await; @@ -139,7 +136,7 @@ async fn test_send_message() { return; } - let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); + let send_button = Locator::css("#sendBtn"); if let Err(e) = browser.click(send_button).await { eprintln!("Failed to click send: {}", e); } @@ -182,14 +179,14 @@ async fn test_receive_bot_response() { return; } - let input_locator = Locator::css("#chat-input, .chat-input, textarea"); + let input_locator = Locator::css("#messageInput"); let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.type_text(input_locator, "Test message").await; - let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); + let send_button = Locator::css("#sendBtn"); let _ = browser.click(send_button).await; - let response_locator = Locator::css(".bot-message, .message-bot, .response"); + let response_locator = Locator::css(".message.bot .bot-message"); match browser.wait_for(response_locator).await { Ok(_) => println!("Bot response received"), Err(e) => eprintln!("No bot response: {}", e), @@ -231,8 +228,8 @@ async fn test_chat_history() { return; } - let input_locator = Locator::css("#chat-input, .chat-input, textarea"); - let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); + let input_locator = Locator::css("#messageInput"); + let send_button = Locator::css("#sendBtn"); for i in 1..=3 { let _ = browser.wait_for(input_locator.clone()).await; @@ -243,7 +240,7 @@ async fn test_chat_history() { tokio::time::sleep(std::time::Duration::from_millis(500)).await; } - let messages_locator = Locator::css(".message, .chat-message"); + let messages_locator = Locator::css(".message"); match browser.find_elements(messages_locator).await { Ok(elements) => { println!("Found {} messages in history", elements.len()); @@ -288,8 +285,8 @@ async fn test_typing_indicator() { return; } - let input_locator = Locator::css("#chat-input, .chat-input, textarea"); - let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); + let input_locator = Locator::css("#messageInput"); + let send_button = Locator::css("#sendBtn"); let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.type_text(input_locator, "Hello").await; @@ -337,7 +334,7 @@ async fn test_keyboard_shortcuts() { return; } - let input_locator = Locator::css("#chat-input, .chat-input, textarea"); + let input_locator = Locator::css("#messageInput"); let _ = browser.wait_for(input_locator.clone()).await; let _ = browser .type_text(input_locator.clone(), "Test enter key") @@ -379,7 +376,7 @@ async fn test_empty_message_prevention() { return; } - let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); + let send_button = Locator::css("#sendBtn"); let _ = browser.wait_for(send_button.clone()).await; match browser.is_element_enabled(send_button.clone()).await { @@ -435,7 +432,7 @@ async fn test_responsive_design() { if browser.set_window_size(width, height).await.is_ok() { tokio::time::sleep(std::time::Duration::from_millis(200)).await; - let chat_container = Locator::css("#chat-container, .chat-container, .chat-widget"); + let chat_container = Locator::css("#chat-app, .chat-layout"); match browser.is_element_visible(chat_container).await { Ok(visible) => { if visible { @@ -485,8 +482,8 @@ async fn test_conversation_reset() { return; } - let input_locator = Locator::css("#chat-input, .chat-input, textarea"); - let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); + let input_locator = Locator::css("#messageInput"); + let send_button = Locator::css("#sendBtn"); let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.type_text(input_locator, "Test message").await; @@ -498,7 +495,7 @@ async fn test_conversation_reset() { match browser.click(reset_button).await { Ok(_) => { tokio::time::sleep(std::time::Duration::from_millis(300)).await; - let messages_locator = Locator::css(".message, .chat-message"); + let messages_locator = Locator::css(".message"); match browser.find_elements(messages_locator).await { Ok(elements) if elements.is_empty() => { println!("Conversation reset successfully");