我正在使用Java和Selenium Webdriver来测试单页Web应用程序的功能。
因此,显然,元素会动态地从DOM中注入和删除。
我知道我可以使用类似的代码使用WebDriverWait等待一个元素存在于DOM中(我编写的非常简洁的模板略有改变GitHub):
public void waitForElement() throws Exception {
/*
Inject the following snippet in any web page to test the method
<button class="i-am-your-class" onclick="alert('Wow, you pressed the button!');">Press me</button>
*/
System.setProperty("webdriver.gecko.driver", "C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe");
WebDriver driver = getDriver();
WebDriverWait wait = new WebDriverWait(driver, 10); // 10 can be reduced as per Test Specifications
driver.get("http://www.google.com");
WebElement response = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@class='i-am-your-class']")));
response.click();
System.out.println("*****************************************************************************");
System.out.println(response);
System.out.println(response.getText());
driver.close();
}
我想知道的是,这也是使用xpath获得此类结果的更有效方法。
我一直在研究Stackoverflow,但有几个答案指向了类似的方向,但没有答案专注于效率/性能:
感谢您的时间和帮助。
答案 0 :(得分:2)
您需要考虑以下几个事实:
WebDriverWait()
100 不应该是实时服务员。请考虑根据测试规范减少它。例如,将其设置为10秒:
WebDriverWait wait = new WebDriverWait(driver, 10);
在您调用click()
方法时向前移动,而不是 ExpectedConditions 作为visibilityOfElementLocated()
方法使用elementToBeClickable()
方法,如下所示:
WebElement response = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class='i-am-your-class']")));
优化 xpath ,包括 tagName ,如By.xpath("//tagName[@class='i-am-your-class']")
中所示。举个例子:
By.xpath("//a[@class='i-am-your-class']")
通过 WebDriverWait 返回元素后,优化代码以调用click()
,如下所示:
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='i-am-your-class']"))).click();
答案 1 :(得分:1)
我不知道你说的是什么原因 XPATH 是首选。我想补充一些关于定位器的内容。
您在代码中编写的 XPATH 可以轻松替换为css selector
。这是一个例子。
div[class='i-am-your-class']
现在主要的问题是为什么要切换到不同的定位器?
您应始终按照 Selenium贡献者
建议的顺序使用定位器注意:大多数时候cssSelector可以替换Xpath,但是Xpath有自己的优点,cssSelector不提供。
如需更多参考,您可以浏览此SO链接:Xpath vs Css selector