【问题标题】:Webdriver enters wrong text in wrong input-elementsWebdriver 在错误的输入元素中输入错误的文本
【发布时间】:2015-09-07 12:54:58
【问题描述】:

我正在使用 selenium 来测试一个 webapp。 它与添加公告/数据有关。它有 很多 个输入...

问题:用于输入 A 的文本 A 随机输入到输入 B 和文本 B 中。

由于有很多重复,我从 xml 读取文本输入并返回字典。并像这样输入文本

public AnnouncementAdvertiserFields TypeAdvertiserFields(string pathToXml)
    {
        var xmlParser = new XmlParser();
        Dictionary<string, string> fields = xmlParser.TypeAdvertiserFieldsFromXml(pathToXml);

        string name;
        string coAddress;
        string streetName;
        string streetNo;
        string streetFloor;
        string streetDoor;
        string city;
        string postalCode;
        string postalCity;
        string phoneNo;
        string mobileNo;
        string faxNo;
        string country;
        string journalNo;

        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.Name, out name);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.CoAdress, out coAddress);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.Streetname, out streetName);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.StreetNumber, out streetNo);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.StreetFloor, out streetFloor);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.StreetDoor, out streetDoor);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.City, out city);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.PostalCode, out postalCode);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.PostalCity, out postalCity);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.PhoneNumber, out phoneNo);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.MobilePhoneNumber, out mobileNo);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.FaxNumber, out faxNo);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.Country, out country);
        fields.TryGetValue(WebTesting.Common.Constants.AdvertiserFieldNames.JounalNo, out journalNo);

        if (name != string.Empty) TypeName(name);
        if (coAddress != string.Empty) TypeCoAddress(coAddress);
        if (streetName != string.Empty) TypeStreetName(streetName);
        if (streetNo != string.Empty) TypeStreetNumber(streetNo);
        if (streetFloor != string.Empty) TypeStreetFloor(streetFloor);
        if (streetDoor != string.Empty) TypeStreetDoor(streetDoor);
        if (city != string.Empty) TypeCity(city);
        if (postalCode != string.Empty) TypePostalCode(postalCode);
        if (postalCity != string.Empty) TypePostalCity(postalCity);
        if (phoneNo != string.Empty) TypePhoneNumber(phoneNo);
        if (mobileNo != string.Empty) TypeMobilePhoneNumber(mobileNo);
        if (faxNo != string.Empty) TypefaxNumber(faxNo);
        if (country != string.Empty) SelectCountryByValue(country);
        if (journalNo != string.Empty) TypeJournalNumber(journalNo);
        return this;
    }

来自AnnouncementAdvertiserFields 的 TypeName 示例

public void TypeName(string name)
{
 TypeText(name, _nameInputLocator); 
}

TypeName 从超类调用泛型 TypeText 方法。

protected void TypeText(string text, By locator)
{ 
  Webdriver.FindElement(locator).SendKeys(text);
}

类型AnnouncementAdvertiserFields是特定公告类型的页面对象页面上的一个属性。

我尝试过同时使用隐式等待和显式等待。有太多的 ExpectedConditions 组合

  • TextToBePresentInElement SendKeys 前后
  • ElementExists
  • ElementIsVisible

我认为这样的代码应该可以工作

var wait = new WebDriverWait(Webdriver, TimeSpan.FromSeconds(5));
wait.Until(ExpectedConditions.ElementIsVisible(locator));
var element = Webdriver.FindElement(locator);
element.Clear();
wait.Until(ExpectedConditions.TextToBePresentInElement(element, ""));
element.SendKeys(text);
Wait.Until(ExpectedConditions.TextToBePresentInElement(FindStdkElement(locator), text));

我也尝试使用SelectElement,但无济于事。

如果我调试我的方式,一切都很棒。没有错误。但是当我运行测试时,有时它会通过其他时间失败。我找不到任何关于哪些字段失败的系统。这是随机的......

当我从本地机器运行测试时,我没有任何问题。但是当从 DEV 中的机器运行时,它们偶尔会失败。 DEV-machine 不如本地强大,这让我认为这可能是一个时间问题。这可能是 Selenium 正在快速输入以使浏览器跟上。

我使用 Nunit 作为测试框架。使用 ReSharper。

任何帮助或指示将不胜感激。谢谢大家

【问题讨论】:

  • 在 TypeText 中,键入后尝试回读元素,看看是否匹配。
  • @stark。谢谢。我这样做了。如果他们不匹配,你会怎么做?我尝试再次输入 exact 相同的内容。但同样的行为:(aaaawwwwww
  • 如果它们不匹配,请记录您的预期和您得到的。这应该告诉你出了什么问题。
  • @stark。问题是 nothing 被输入。应该输入一个输入的内容会在下一个输入中输入。

标签: c# c#-4.0 selenium-webdriver nunit pageobjects


【解决方案1】:

我认为可能存在时间问题。如果有超时,则增加您给出的超时时间,然后再次运行它并检查您的 DEV 机器中是否有失败的测试。

增加超时。试试这个...

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

参考 - http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

【讨论】:

  • 我增加了隐式等待的超时时间。但我害怕没有变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2020-09-02
相关资源
最近更新 更多