我想解决的问题是这样的:我试图从一个网页中抓取一些内容,我使用selenium,findElementByClassName来获取元素内容,直到现在它都很好用。但是,考虑到我正在抓取的网站更改了html中的一个元素类,我不想得到一个could not find element exception,使得其余的代码不执行,直接跳入catch块。
我的想法是将每一行代码放入一个try catch块中,但是有大约15个字段我想要刮掉,这使得代码看起来很难看。你自己看看:
String name = null;
String type = null;
String description = null;
try {
driver.get(link);
try {
name = driver.findElementByClassName(environment.getProperty("booking.propertyName")).getText();
}catch (Exception e){
log.error("error doing thing");
}
try {
type = driver.findElementByClassName(environment.getProperty("booking.propertyType")).getText();
}catch (Exception e){
log.error("error doing thing");
}
try {
description = driver.findElementByClassName(environment.getProperty("booking.propertyDescription")).getText();
}catch (Exception e){
log.error("error doing thing");
}
}catch (Exception e){
log.error("Error during scraping");
}因此,如果其中一件事情出了问题,我仍然希望代码的其余部分继续运行,而不是在第一个失败会阻止其他事情执行的试图捕获块中。上面的代码工作得很好,但它看起来不太好,所以我的问题你知道我怎样才能让这个看起来更好看吗?
发布于 2022-04-15 21:37:19
这里没有魔法子弹。但是避免重复代码的标准方法是重构。例如:
try {
type = driver.findElementByClassName(environment.getProperty("something"))
.getText();
} catch (Exception e){
log.error("error doing thing");
}可重写为:
type = getElementTextIgnoringExceptions(driver, environment, "something");其中,getElementTextIgnoringExceptions被定义为如下所示:
public String getElementTextIgnoringExceptions(
Driver driver, Environment env, String name) {
try {
String className = env.getProperty(name);
return driver.findElementByClassName(className).getText();
} catch (Exception ex) {
log.error("error getting " + name, ex);
return null;
}
}但是..。在这里,您试图简化的代码有一些不好的地方:
Exception是不好的。您不知道将捕获什么,也不知道是否安全或明智地继续下去。null检查中,以处理无法获取的元素(或任何其他元素)。如果错过一次检查,您就很容易得到NPE;例如,在单元测试中没有涵盖的边缘情况下。这些问题比代码看起来更有意义。
如果您使用的是Java,则可以重构,以便将逻辑作为lambda表达式传递。这取决于使用的变量的性质。
https://stackoverflow.com/questions/71888989
复制相似问题