Java - 如何在找不到所有元素时添加第二个 Java Selenium
Java - how to add a second while all elements can't be found Java Selenium
我想问一下如何让我的 for 循环工作,我想做的就是在找不到所有 6 个元素时每秒计数。我有 6 个图表,我想看看加载 6 个图表需要多长时间,我不在乎 1 个图表是否加载 2 秒,我想看看每个图表都出现需要多长时间。
@Test
public void loadingTime(){
for(int t = 0; t < 100; t++){
WebElement first = driver.findElement(By.xpath("//*[@id=\"chart_mnic\"]/svg"));
WebElement second = driver.findElement(By.xpath("//*[@id=\"chart_ci\"]/canvas[2]"));
WebElement third = driver.findElement(By.xpath("//*[@id=\"//*[@id=\"chart_cnic\"]/canvas[2]"));
WebElement fourth = driver.findElement(By.xpath("//*[@id=\"chart_cac\"]/canvas[2]"));
WebElement fifth = driver.findElement(By.xpath("//*[@id=\"chart_mq\"]/svg"));
WebElement sixth = driver.findElement(By.xpath("//*[@id=\"chart_cq\"]/canvas[2]"));
break;
}
}
所以我想知道我是否通过隐式等待或其他方式来执行此操作?我对编程还很陌生,所以我似乎找不到解决方案。
任何帮助将不胜感激,即使建议的解决方案完全不同,我也乐于接受想法。
如果有帮助,问题中的图表是可点击的。
在每次迭代的开始和结束时得到System.currentTimeMillis
。两者的区别在于需要多长时间。
您的测试的问题是 - 它太简单了:是的,您不关心六个 运行 中的哪一个需要一秒或两秒。但是:你正在调用它们顺序。所以你总能得到所有人在一起的时间。
您需要更复杂的解决方案;基本上有两种选择:
你接受了 "timewise" 命中;你只需保持该代码不变即可。但是您按照其他答案的建议去做:并且您 "measure" 自己处理每个请求的时间;喜欢:
for each X in requests
now = fetch timestamp
run request X
then = fetch timestamp
delta = (then - now)
当然,当你真的想看看当所有这些事情运行并行时会发生什么,你必须考虑使用Thread/Runnables。
编辑:
首先,您应该研究测量请求执行时间的方法;一个起点是 this SO question.
当您对这部分感到满意时,您可以查看 this 等示例,以了解如何使用线程来并行 运行 事物。
我会把你的功能改成
@Test
public void loadingTime() {
String[] xPathToWait = new String[] {
"//*[@id=\"chart_mnic\"]/svg", "//*[@id=\"chart_ci\"]/canvas[2]", "//*[@id=\"//*[@id=\"chart_cnic\"]/canvas[2]", "//*[@id=\"chart_cac\"]/canvas[2]", "//*[@id=\"chart_mq\"]/svg", "//*[@id=\"chart_cq\"]/canvas[2]"
};
WebDriverWait wait = new WebDriverWait(driver, 10); // could be changed to appropriate value
long startedAt = System.nanoTime();
for(String xPath : xPathToWait) {
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(xPath)));
}
long endedAt = System.nanoTime();
long durationNano = endedAt - startedAt;
long durationMs = durationNano / 1000000; //if you wish, you can divide the result by 1 million to get duration in milliseconds
}
说明
首先:没有理由将同一行(仅 xpath 不同)重复 6 次,所以让我们将所有 xpath 保存在一个数组中并循环访问它们。
其次:循环100次希望能找到什么是不可靠的。相反,您可以利用 Selenium 的 explicit wait 恰好找到每个项目一次。超时(我设置为 10 秒)应设置为您准备等待图表显示的最大秒数。
最后 System.nanoTime()
为您提供开始和结束时间,您可以将其相减以获得以纳秒或毫秒为单位的持续时间,无论您喜欢哪个。
为什么这会起作用:
- 测试等待第一个图表。假设它在 X 秒后出现(其中 X < 您为
WebDriverWait
指定的超时)。
- 然后进入下一张图。话说那个时候那个已经出现了,测试就不用等了
- 转到图 3。假设(例如)图 3 尚未显示。所以它将在那里等待 Y 秒。因此,现在您获得的总时间是
X + Y
,这等于加载所有 3 个图表所花费的时间
- 以此类推
所以最后你得到的持续时间等于加载所有图表所花费的时间。在这种情况下,它需要加载所有图表,只要其中最长的图表就可以加载。
另一种选择是开发自定义 ExpectedCondition,等待所有图表加载。
我想问一下如何让我的 for 循环工作,我想做的就是在找不到所有 6 个元素时每秒计数。我有 6 个图表,我想看看加载 6 个图表需要多长时间,我不在乎 1 个图表是否加载 2 秒,我想看看每个图表都出现需要多长时间。
@Test
public void loadingTime(){
for(int t = 0; t < 100; t++){
WebElement first = driver.findElement(By.xpath("//*[@id=\"chart_mnic\"]/svg"));
WebElement second = driver.findElement(By.xpath("//*[@id=\"chart_ci\"]/canvas[2]"));
WebElement third = driver.findElement(By.xpath("//*[@id=\"//*[@id=\"chart_cnic\"]/canvas[2]"));
WebElement fourth = driver.findElement(By.xpath("//*[@id=\"chart_cac\"]/canvas[2]"));
WebElement fifth = driver.findElement(By.xpath("//*[@id=\"chart_mq\"]/svg"));
WebElement sixth = driver.findElement(By.xpath("//*[@id=\"chart_cq\"]/canvas[2]"));
break;
}
}
所以我想知道我是否通过隐式等待或其他方式来执行此操作?我对编程还很陌生,所以我似乎找不到解决方案。
任何帮助将不胜感激,即使建议的解决方案完全不同,我也乐于接受想法。
如果有帮助,问题中的图表是可点击的。
在每次迭代的开始和结束时得到System.currentTimeMillis
。两者的区别在于需要多长时间。
您的测试的问题是 - 它太简单了:是的,您不关心六个 运行 中的哪一个需要一秒或两秒。但是:你正在调用它们顺序。所以你总能得到所有人在一起的时间。
您需要更复杂的解决方案;基本上有两种选择:
你接受了 "timewise" 命中;你只需保持该代码不变即可。但是您按照其他答案的建议去做:并且您 "measure" 自己处理每个请求的时间;喜欢:
for each X in requests
now = fetch timestamp
run request X
then = fetch timestamp
delta = (then - now)
当然,当你真的想看看当所有这些事情运行并行时会发生什么,你必须考虑使用Thread/Runnables。
编辑:
首先,您应该研究测量请求执行时间的方法;一个起点是 this SO question.
当您对这部分感到满意时,您可以查看 this 等示例,以了解如何使用线程来并行 运行 事物。
我会把你的功能改成
@Test
public void loadingTime() {
String[] xPathToWait = new String[] {
"//*[@id=\"chart_mnic\"]/svg", "//*[@id=\"chart_ci\"]/canvas[2]", "//*[@id=\"//*[@id=\"chart_cnic\"]/canvas[2]", "//*[@id=\"chart_cac\"]/canvas[2]", "//*[@id=\"chart_mq\"]/svg", "//*[@id=\"chart_cq\"]/canvas[2]"
};
WebDriverWait wait = new WebDriverWait(driver, 10); // could be changed to appropriate value
long startedAt = System.nanoTime();
for(String xPath : xPathToWait) {
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(xPath)));
}
long endedAt = System.nanoTime();
long durationNano = endedAt - startedAt;
long durationMs = durationNano / 1000000; //if you wish, you can divide the result by 1 million to get duration in milliseconds
}
说明
首先:没有理由将同一行(仅 xpath 不同)重复 6 次,所以让我们将所有 xpath 保存在一个数组中并循环访问它们。
其次:循环100次希望能找到什么是不可靠的。相反,您可以利用 Selenium 的 explicit wait 恰好找到每个项目一次。超时(我设置为 10 秒)应设置为您准备等待图表显示的最大秒数。
最后 System.nanoTime()
为您提供开始和结束时间,您可以将其相减以获得以纳秒或毫秒为单位的持续时间,无论您喜欢哪个。
为什么这会起作用:
- 测试等待第一个图表。假设它在 X 秒后出现(其中 X < 您为
WebDriverWait
指定的超时)。 - 然后进入下一张图。话说那个时候那个已经出现了,测试就不用等了
- 转到图 3。假设(例如)图 3 尚未显示。所以它将在那里等待 Y 秒。因此,现在您获得的总时间是
X + Y
,这等于加载所有 3 个图表所花费的时间 - 以此类推
所以最后你得到的持续时间等于加载所有图表所花费的时间。在这种情况下,它需要加载所有图表,只要其中最长的图表就可以加载。
另一种选择是开发自定义 ExpectedCondition,等待所有图表加载。