使用特定颜色使结果中的所有项目自动化搜索结果

时间:2014-11-12 11:15:42

标签: selenium selenium-webdriver cucumber specflow

我有一个服装零售网站的搜索方案。

使用Specflow框架(C#)和Selenium。

我需要自动化搜索小部件及其结果。

1)搜索小部件产生不同类型的结果:项目名称,部分文本,服饰类型

2)它也会根据产品的颜色产生结果,即如果产品具有特定的颜色,则可以得到结果。

EG:如果我输入了#34;蓝色"在搜索widghet中,它会产生所有内部有蓝色或可用的产品/物品。

3)问题是颜色仅在产品详细信息页面中可用,而不在产品搜索页面中。产品搜索页面仅以列表形式为您提供产品的最终结果,其中包括产品图片,产品名称,价格等。

4)如何自动化这样一种场景,即我确认列出的所有产品都具有该特定属性或说蓝色而不进入产品详细信息页面。

3 个答案:

答案 0 :(得分:1)

不幸的是我认为你可能已经回答了自己的问题,但是让我们分解你在这里要做的事情。你拥有的场景就是

When i enter "blue" it should return me back all the items/clothes which is blue

这对我来说意味着您正在使用涵盖

的验收级别测试来测试系统的许多不同部分
  • 数据库连接/授权
  • 查询构建
  • 结果反序列化/模型转换为可查看的形式(ViewModel)
  • 在UI中构建列表/缩略图视图

你也在你的场景中使用了all这个词,这意味着我们需要实际测试两个的东西

  • 返回的所有结果都包括蓝色和
  • 蓝色没有其他未返回的结果

返回的所有结果都包括蓝色

你可以编写一个函数来获取item / clothing并检查它们的字段,以确保其中一个包含蓝色,但是你会陷入编写并行测试代码的过程中。考虑这个问题代码

select * from Items
where tags like '%blue%'
or description like '%blue%

public void IsBlue(Item item)
{
  return item.Tags.Contains("blue") || item.Description.Contains("blue");
}

随着代码的更改,您必须不断重写测试以使其通过。

不幸的是,可靠地测试用户看到蓝色的东西的唯一方法是显示他们将看到的内容。如果列表/缩略图视图不包含蓝色,则必须导航到详细信息页面并进行检查。你真正想要的是像

这样简单的东西
IsTrue(DetailsPage.Html.ToString().Contains("blue", CaseInsensitive));

蓝色没有其他未返回的结果

在某些方面,这更难实现。我们可以再一次复制查询,但这会导致

if (GetAllBlueThingsFromDb() == GetAllBlueThingsFromDb()) ....

更好的方法是使用已知数据库,在每次测试运行后重置为默认状态。

public const int NumberOfBlueThingsInTestDb = 42;
if (GetAllBlueThingsFromDb() == NumberOfBlueThingsInTestDb) ....

答案 1 :(得分:0)

您唯一的选择,如果搜索结果未提供所需信息,则进一步查询以获取该信息。你标记了这个specflow,所以让你的步骤很有用,但假设你的步骤看起来像这样:

When i enter "blue" and search
Then all the items/clothes in the results are blue

然后你可以实现你的后续步骤(伪代码):

foreach(var result in searchResults)
{
    if (GetItemColour(result)!=Colours.Blue)
    {
         Assert.Fail("Non blue item returned: " + result);
    }
}

private Colour GetItemColour(SaerchResult result)
{
   //navigate to item description page for given item
   //or call some API to get item details for given search result id
   // then return the colour from that page
} 

答案 2 :(得分:0)

尝试这样的事情,下面的代码段应该让你知道如何去做这件事

//Locator is a custom class created with methods such as hasClass, getElement
//Instead of an Element you should consider using something like a 
//List<WebElement> that returns list of elements.


 public boolean hasClass(String className) {

     return webElement  != null && 
                        ((WebElement) webElement).getAttribute("class").contains(className);
 }

 Locator locator = Locator.by(by);

 if(locator.hasClass("colorBlue")) {
     Assert.assertTrue;
 } else {
    Assert.Fail( "No Items with color");
 }

希望这有帮助