You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:24:02