我的自动化测试几乎没有问题。当我的测试出错时:
预期条件失败:等待位于(…)的元素的可见性
我不知道什么是问题。
@BeforeMethod
public void BeforeTest(){
System.setProperty("webdriver.chrome.driver", "C:/drivers/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.navigate().to("https://poczta.o2.pl/rejestracja/");
}
@Test
public void Test(){
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement Category_Body = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("[name='9cb78dee-04b3-01d5-524b-9159a1646cd3']")));
WebElement user = driver.findElement(By.cssSelector("[name='9cb78dee-04b3-01d5-524b-9159a1646cd3']"));
user.sendKeys("Cezary");
WebElement user2 = driver.findElement(By.cssSelector("input[name*='42aced']"));
user2.sendKeys("Znojek");
WebElement male = driver.findElement(By.id("male"));
((WebElement) male).click();
}
我的问题是什么?
似乎名称9cb78dee-04b3-01d5-524b-9159a1646cd3
是动态的。例如,当我现在加载页面时,“名字”元素如下所示:
<input type="text" name="2a810eef-304a-e7bb-d148-f9655e639f02" aria-labelledby="0bd5980e-a03a-4dd9-1302-105b999c3afc" class="invalid sc-bZQynM bZqAGh" autocomplete="off" value="">
所以你不能用它来识别对象。对于那种特定的形式,我建议查找标签,然后获取与之关联的输入字段。它们都包含在同一个div中,所以很容易区分:
<div class="">
<label id="790a1161-7317-afc5-7563-1973254ccc96" class="sc-dnqmqq dsXufX">Imię</label>
<input type="text" name="885f994f-f81e-7142-c3f0-61420449b0b7" aria-labelledby="790a1161-7317-afc5-7563-1973254ccc96" class="sc-bZQynM bZqAGh" autocomplete="off" value="">
</div>
在XPath中,它可以这样表达:
//label[text()='Imię']/../input
(选择标签,返回父级再选择同一父级下的输入字段)
这样的选择在语义上也更好,因为它非常清楚你在选择什么(名称字段),而不是通过GUID进行选择,GUID不会告诉你你在选择什么。
在CSS选择器中,恐怕这是不可能的,因为它不支持通过文本进行选择(我可能错了,因为CSS选择器不是我的强项)。