2016-11-26 111 views
0

这可能有点奇怪的问题,因为我确信你每天都看不到这样的事情。如何保存坐标并稍后参考,使用C#和WebDriver?

我正在开发一个程序,它会自动处理一系列问题并为用户选择正确的答案。它的工作方式是首先通过按下页面上的一个按钮“检查答案”来解决问题,通过RGB颜色和(在不久的将来)找到正确答案,然后再次查看问题,这次根据我们之前收集的信息点击正确答案。

这是问题;显然,我不想只在一个问题上按下所有正确答案的坐标,并且每一个问题都会这样做!我想要做的是将保存的这些坐标保存到一个变量中,以某种方式将它们与发现的任何问题相关联,并在自动填写正确答案时仅引用与该特定问题相对应的坐标。

我基本上说的是我想将某些坐标与页面的某些“部分”关联起来。

下面是一些程序代码:

IReadOnlyCollection<IWebElement> unfiltered = Driver.FindElements(By.CssSelector("*")); 
Console.WriteLine(unfiltered.Count); 
List<IWebElement> filtered = unfiltered.Where(f => f.GetCssValue("color") == "rgba(180, 137, 59, 1)").ToList(); 
Console.WriteLine(filtered.Count); 
foreach (IWebElement element in filtered) 
{ 
    Console.WriteLine(element.Location.X); 
    Console.WriteLine(element.Location.Y); 
    //Save coordinate(s) to variable pertaining to specific question? 
} 

上面的代码是在我的程序循环。一旦它获得了与特定RGB颜色匹配的所有坐标,它就会转到下一个问题,并且它将再次运行该代码。我希望能够将element.Location.Xelement.Location.Y保存为变量,无论它出现什么问题。

+0

你肯定的答案并非每次都问洗牌?你怎么知道每次坐标都完全相同?如果你确定答案没有被洗牌,我会按照答案的索引而不是坐标进行。页面上的坐标可能会受很多因素影响...索引不会。 – JeffC

+0

Hi @JeffC;我知道这样一个事实,即问题和答案不会以任何方式拖垮。基本上,现在写东西的方式,我的WebDriver通过识别正确答案的颜色找到所有东西,但是您认为这不是实现此目的最实际的方法。当你说,“我会按照答案的索引去做”,你到底提出了什么,我用这个机制来取代?我诚实地想不出任何其他方式在页面上找到正确的答案(由于页面是结构化的)。如果可能,我可以有代码示例吗? – MTS11648

+0

如果您将发布HTML示例,我会尝试发布代码示例。我基本上假设答案是单选按钮或类似的。你可以为一个给定的问题捕获它们的集合,然后发现第三个答案是正确的,然后在某处记录Q1 A3而不是坐标。 – JeffC

回答

0

像这样的东西可能会奏效:)

public class QuestionElement 
{ 
    public IWebElement Element { get; set; } 

} 

public class QuestionItem 
{ 
    public string QuestionID { get; set; } 
    public list<QuestionElement> Elements; 
} 

public class QuestionItems 
{ 
    public SortedList<QuestionItem> Questions { get; set; } 
} 

public class PopulateQuestionItem() 
{ 


    public void AddQuestionResult(string questionID, QuestionItems questionItems, string colorItem) 
    { 
     IReadOnlyCollection<IWebElement> unfiltered = Driver.FindElements(By.CssSelector("*")); 

     List<IWebElement> filtered = unfiltered.Where(f => f.GetCssValue("color") == colorItem).ToList(); 
     QuestionItem questionItem = new QuestionItem() { QuestionID = questionID }; 

     foreach (IWebElement element in filtered) 
     { 
      QuestionElement item = new QuestionElement() 
      { 
       Element = element 

      }; 
      questionItem.ElementsAdd(item); 
     } 

     questionItems.Questions.Add(questionID, questionItem); 

    }