问题:Java中的异常处理实际上是否很慢?
传统观念以及许多谷歌搜索结果表明,不应将特殊逻辑用于Java中的正常程序流程.通常有两个原因,
和
这个问题是关于#1.
例如,这个页面将Java异常处理描述为"非常慢",并将缓慢与异常消息字符串的创建联系起来 - "然后将此字符串用于创建抛出的异常对象.这并不快." Java中的有效异常处理这篇文章说"其原因在于异常处理的对象创建方面,从而使异常本身变得缓慢".另一个原因是堆栈跟踪生成减慢了它的速度.
我的测试(使用Java 1.6.0_07,Java HotSpot 10.0,在32位Linux上)表明异常处理并不比常规代码慢.我尝试在循环中运行一个执行一些代码的方法.在方法结束时,我使用布尔值来指示是返回还是抛出.这样实际处理是一样的.我尝试以不同的顺序运行方法并平均我的测试时间,认为它可能是JVM升温.在我的所有测试中,投掷至少与返回一样快,如果不是更快(最多快3.1%).我对我的测试错误的可能性持开放态度,但我没有看到代码示例,测试比较或过去一两年中显示Java中的异常处理的结果慢.
让我沿着这条路走下去的是我需要使用的API,它将异常作为正常控制逻辑的一部分.我想在他们的使用中纠正它们,但现在我可能无法做到.相反,我是否必须赞美他们的前瞻性思维?
在即时编译中的高效Java异常处理文章中,作者建议单独存在异常处理程序,即使没有抛出异常,也足以阻止JIT编译器正确优化代码,从而减慢它的速度.我还没有测试过这个理论.
我想确保在webdriver开始执行操作之前存在一个元素.
我正试图让这样的东西起作用:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Run Code Online (Sandbox Code Playgroud)
我主要是在努力设置如何设置任何功能..
如何检查Web驱动程序是否存在元素?
真正使用try catch是唯一可行的方法吗?
boolean present;
try {
driver.findElement(By.id("logoutLink"));
present = true;
} catch (NoSuchElementException e) {
present = false;
}
Run Code Online (Sandbox Code Playgroud) 启动功能时
def run(driver_path):
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://tproger.ru/quiz/real-programmer/')
button = driver.find_element_by_class_name("quiz_button")
button.click()
run(driver_path)
Run Code Online (Sandbox Code Playgroud)
我收到这样的错误:
def run(driver_path):
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://tproger.ru/quiz/real-programmer/')
button = driver.find_element_by_class_name("quiz_button")
button.click()
run(driver_path)
Run Code Online (Sandbox Code Playgroud)
...但我不明白为什么。
我正在为我的 Chrome 版本使用最新版本的WebDriver 。我不知道为什么我得到
<ipython-input-27-c5a7960e105f>:6: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(executable_path=driver_path)
<ipython-input-27-c5a7960e105f>:10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
button = driver.find_element_by_class_name("quiz_button")
Run Code Online (Sandbox Code Playgroud)
...当文档中存在该命令时。
如何过滤具有相同类的元素?
<html>
<body>
<p class="content">Link1.</p>
</body>
<html>
<html>
<body>
<p class="content">Link2.</p>
</body>
<html>
Run Code Online (Sandbox Code Playgroud) 我有这个逻辑,当前页面的标题首先点击下一个按钮,再次获取标题,如果两个标题相同,意味着导航没有移动到下一页,它再次点击下一步.
但是,我的问题是title元素的Xpath不同 - 相同的title元素有两个Xpath.一个是其他页面中的另一个页面.
就是这个,
(.//span[@class='g-title'])[2]
Run Code Online (Sandbox Code Playgroud)
要么
.//span[@class='g-title']
Run Code Online (Sandbox Code Playgroud)
那么,我该怎么处理呢?
所以我正在使用Selenium和Python进行一些网络抓取,我遇到了问题.我点击"下一步"按钮移动到某个网站的下一页,但是当我到达最后一页时,我需要停止点击它.现在,我这样做的想法就是在try/except语句中使用some_element.click()并等到它给我一个错误,而按钮不再可点击.看来,.click()不会发出任何类型的信号,当按钮无法点击并且不发出任何真或假信号时,它不会抛出错误.
我尝试使用的代码段:
while True:
try:
button = driver.find_element_by_class_name('Next_button')
button.click()
except:
break
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?谢谢和欢呼.
我知道我可以用 (driver.findElements(By.xpath("Xpath Value")).size() != 0);
但是,我使用的是页面对象模型,其全部目的是在单独的类中预定义WebElement,因此不必在测试类中使用“ FindElements By”。
这是我目前拥有的
if (objPage.webElement.isEnabled()){
System.out.println("found element");
}else{
System.out.println("element not found");
}
Run Code Online (Sandbox Code Playgroud)
但是,这试图识别可能不存在的WebElement。当它不存在时,我得到:
没有此类元素”例外。
是override WebElement click()添加一些wait功能的好习惯,因为在某些页面中我需要单击按钮,并且在某些情况下还没有加载按钮,因此我添加了等待以检查元素是否可见。
所以我的问题是:创建abstract class一个实现WebElement并重写click()方法以添加一些等待功能的更好的方法,还是仅在特定页面中进行纯等待的方法更好?
我想知道List当我试图找到一些WebElement但没有找到时,如何返回空.当然我想避免崩溃,所以这就是我尝试过的:
def getList(): List[WebElement] = {
try {
driver.fineElements(By.xpath("bla bla))
}catch{
case e: TimeoutException => // What should i put here ???
}
}
Run Code Online (Sandbox Code Playgroud) selenium ×8
java ×4
webdriver ×3
python ×2
automation ×1
c# ×1
findelement ×1
pageobjects ×1
performance ×1
scala ×1
testing ×1
web-scraping ×1
xpath ×1