我正在Selify中创建一个单元测试,它修改了一系列下拉菜单,以测试它们的选项是否正确加载并按预期工作.

目前,测试使用FindElements和XPath获取所有下拉菜单,并使用Foreach循环 Select 和修改每个下拉菜单.

当它运行时,第一个下拉菜单被更改,它继续逐个 Select 其余的菜单,但它永远不会更改选项.

我try 添加显式和隐式等待,以查看它是否进行得太快并跳过它们.这并没有解决这个问题,所以我添加了一个thread.sleep()来try 跟踪它所做的事情.每个菜单都被正确点击,但除第一个菜单外,其他任何菜单的选项都不会更改.

C #

public bool editMessages(IWebDriver driver, String option) 
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    IWebElement selectOption;
    foreach (var selectBox in driver.FindElements(By.XPath("(//div[@class = 'col-4']//select)")))
    {
        selectBox.Click();
        selectOption = selectBox.FindElement(By.XPath($"//option[text() = '{option}']"));
        Thread.Sleep(1000);
        selectOption.Click();
    }
    return false;
}

超文本标记语言

<div class="col-4" ng-show="editMessagesMode" aria-hidden="false" style="">
  <span>
    <select class="selectbox ng-pristine ng-valid ng-not-empty ng-valid-required  ng- touched" name="messageSelect" ng-model="message.status" required="" ng-change="updateSelectedMessageValues(message.message_id, value)" style="height: 35px; width: 100%; float: left; margin-top: -11px; padding: 1px; color: rgb(0, 85, 165);" ng-options="c.value as ('MESSAGE_TYPE_' + c.value) | translate for c  in selectMessages" aria-invalid="false">
      <option disabled="" translate="SELECT" value="" class="">Select</option>
      <option label="In-Active" value="number:0">In-Active</option>
      <option label="Cups-On" value="number:1" selected="selected">Cups-On</option>
      <option label="Cups-Off" value="number:2">Cups-Off</option>
      <option label="Both" value="number:3">Both</option>
    </select>
  </span>
</div>

目前共有5个相同的下拉列表,但这个数字会波动.

推荐答案

问题很可能是这条线

selectOption = selectBox.FindElement(By.XPath($"//option[text() = '{option}']"));

您将开始从现有元素selectBox中搜索新元素.为了对XPath执行此操作,您必须以.开始XPath,这样该行将更改为

selectOption = selectBox.FindElement(By.XPath($".//option[text() = '{option}']"));
                                                ^

此外,还有一个内置的SelectElement类,专门设计用来简化 Select 元素的处理.如果我们将代码转换为使用该代码,它将变得简单得多.

public bool editMessages(IWebDriver driver, String option)
{
    foreach (IWebElement selectBox in driver.FindElements(By.XPath("(//div[@class = 'col-4']//select)")))
    {
        new SelectElement(selectBox).SelectByText(option);
    }
    return false;
}

Csharp相关问答推荐

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

在依赖性注入和继承之间进行 Select

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

CS0103 dlibdotnet和www.example.com facerect不在上下文中

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

与C#中的Zip列表并行

在实体框架中处理通用实体&S变更跟踪器

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

DbContext-传递自定义配置选项

如何管理Azure认证客户端响应和证书 fingerprint

如何在onNext之前等待订阅者完成?

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

基于C#方法的EF核心过滤查询(缓冲与流)

在.NET Maui中,Flyoutindow/Hamburger菜单可以在shell 之外实现吗?

为什么我的自定义Json.net转换器不工作?

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

Xamarin.Forms项目中缺少MainPage.xaml

获取应用程序版本信息时出现奇怪信息

不寻常的C#语法