Selenium Webdriver+C#实现铁路网站自动化测试的多场景问题咨询
Selenium WebDriver + C# 白俄铁路网站测试实现方案
卡点解决逻辑
- 元素数量校验:统一使用
FindElements()方法获取匹配元素集合,直接读取集合Count属性做断言即可 - 元素位置校验:无需硬编码X/Y坐标,可先定位顶部导航栏父容器,校验5个导航按钮均为该父容器的子元素且
Displayed属性为true,也可通过判断元素Y坐标小于导航栏最大高度二次确认,符合测试逻辑 - 随机字符串生成:通过C#内置
Random类实现,每次运行生成20位大小写字母+数字组合的随机字符串 - 地址跳转校验:直接读取
driver.Url属性和目标地址前缀做匹配即可 - 搜索结果提取:用
FindElements()定位所有搜索结果链接,遍历输出文本即可
完整测试代码
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; using System; using System.Linq; [Test] public void Test1() { // 前置:请根据实际页面DOM调整以下元素定位器 By _newsItemLocator = By.CssSelector(".news-list .news-item"); // 新闻项定位 By _copyrightLocator = By.CssSelector("footer .copyright"); // 页脚版权定位 By _navContainerLocator = By.CssSelector("header .main-nav"); // 顶部导航容器定位 string[] _expectedNavButtons = {"Press Center", "Timetable", "Passenger Services", "Freight", "Corporate"}; By _inputField = By.Name("q"); // 搜索输入框定位 By _searchButton = By.CssSelector(".search-btn"); // 搜索按钮定位 By _noResultTipLocator = By.CssSelector(".search-no-result"); // 无搜索结果提示定位 By _searchResultLinkLocator = By.CssSelector(".search-result-list .item a"); // 搜索结果链接定位 var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); // 1. 校验新闻板块不少于4条新闻 var newsItems = driver.FindElements(_newsItemLocator); Assert.GreaterOrEqual(newsItems.Count, 4, "新闻数量不足4条"); // 2. 校验底部版权文本 var copyrightEle = driver.FindElement(_copyrightLocator); Assert.AreEqual("© 2019 Belarusian Railway", copyrightEle.Text.Trim(), "页脚版权文本不符"); // 3. 校验顶部5个导航按钮存在且位于顶部区域 var navContainer = driver.FindElement(_navContainerLocator); int navMaxY = navContainer.Location.Y + navContainer.Size.Height; foreach (var btnText in _expectedNavButtons) { var btnEle = navContainer.FindElement(By.LinkText(btnText)); Assert.IsTrue(btnEle.Displayed, $"导航按钮{btnText}未显示"); Assert.Less(btnEle.Location.Y, navMaxY, $"导航按钮{btnText}不在顶部导航区域内"); } // 4. 生成20位随机字符输入搜索框 string randomStr = GenerateRandomString(20); var inputField = driver.FindElement(_inputField); inputField.Clear(); inputField.SendKeys(randomStr); // 点击搜索按钮 var searchBtn = driver.FindElement(_searchButton); searchBtn.Click(); wait.Until(d => d.Url.Contains("search/?s=Y&q=")); // 5. 校验跳转地址前缀 Assert.IsTrue(driver.Url.StartsWith("https://www.rw.by/search/?s=Y&q="), "搜索跳转地址不符"); // 6. 校验无搜索结果提示 var noResultTip = driver.FindElement(_noResultTipLocator); Assert.AreEqual("К сожалению, на ваш поисковый запрос ничего не найдено.", noResultTip.Text.Trim(), "无结果提示文本不符"); // 7. 清空输入框输入目标城市 inputField = driver.FindElement(_inputField); inputField.Clear(); inputField.SendKeys("Санкт-Петербург"); // 8. 点击查询按钮 searchBtn = driver.FindElement(_searchButton); searchBtn.Click(); wait.Until(d => d.FindElements(_searchResultLinkLocator).Count >=1); // 9. 校验页面展示15条文章链接 var resultLinks = driver.FindElements(_searchResultLinkLocator); Assert.AreEqual(15, resultLinks.Count, "搜索结果链接数量不符"); // 10. 输出链接文本到控制台 Console.WriteLine("=====搜索结果链接文本如下====="); foreach (var link in resultLinks) { Console.WriteLine(link.Text.Trim()); } Assert.Pass(); } // 随机字符串生成辅助方法 private string GenerateRandomString(int length) { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; var random = new Random(); return new string(Enumerable.Repeat(chars, length) .Select(s => s[random.Next(s.Length)]).ToArray()); }
注意事项
- 所有By定位器需要根据实际页面的DOM结构调整,确保定位准确
- 替换原有
Thread.Sleep为显式等待,测试运行稳定性更高,可根据页面加载速度调整等待时长 - 测试前需确保页面已加载完成,可在测试最开始添加显式等待等待页面根元素加载完成
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

