我的自动化测试没什么问题。当我的测试出错时:
预期条件失败:正在等待由(...)定位的元素
我不知道这是什么问题。
@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();
}
我怎么了?
答案 0 :(得分:1)
看来名称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进行选择(它不会告诉您所选择的内容)相比,它很清楚您正在选择的内容(名称字段)。
恐怕在CSS选择器中这是不可能的,因为它不支持按文本选择(我可能是错的,因为CSS选择器不是我的特长)。