我正在尝试使用Python驱动程序自动化Google,我的代码是稳定的,可以得到我需要的东西,,但不是性能时间。
我使用迭代代码通过Google获取商家数据,使用Selenium获取1个商家数据的时间低于1秒,但是当代码发现异常时,需要花费6到7秒的时间。
以下是一些执行时间的摘要:
https://picoolio.net/image/dgxC (正常执行时间)
https://picoolio.net/image/dgxT (在开放时间发生异常时,执行时间太长)
https://picoolio.net/image/dgxV (异常发生时的执行时间,有时按预期运行)
下面是一些开放时间列表的代码:
try:
openhour = wait(driver, 1).until(EC.visibility_of_element_located((By.XPATH,
'.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))
driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
openhour.click()
openhourstacked = wait(driver, 1).until(EC.visibility_of_element_located((By.CLASS_NAME,
'section-open-hours-container-hoverable'))).get_attribute("aria-label")
openhourlist = openhourstacked.split(",")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]
except NoSuchElementException:
openhourlist = []
print("No Open Hour list in this merchant!")
openhour_trig = True
except WebDriverException:
openhourlist = []
print("Failed to load Open Hour list in this merchant!")
openhour_trig = True许多建议说,要正确地执行显式等待,我应该使用WebDriverWait和EC (预期条件)的组合,我直接用上面的代码进行了尝试,但是WebDriverWait似乎并不适用于所有传入的异常,换句话说,有时成功,有时失败。
我试图用EC.visibility_of_all_element_located替换EC.presence_of_all_element_located,但这并没有什么区别。
当出现异常时,我希望使执行时间保持平稳,除了上述方法之外,还有什么方法可以使Selenium在超时时停止查找元素吗?或者这是互联网连接的问题?任何想法都欢迎!
更新:所以我将开放时间代码修改为类似于下面的
try:
if len(driver.find_elements(By.XPATH, './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]'))>0:
openhour = wait(driver, 5).until(EC.visibility_of_element_located((By.XPATH,
'.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))
#openhour = driver.find_element_by_xpath('.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')
driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
openhour.click()
#openhourstacked = driver.find_element_by_class_name('section-open-hours-container-hoverable').get_attribute("aria-label")
openhourstacked = wait(driver, 5).until(EC.visibility_of_element_located((By.CLASS_NAME,
'section-open-hours-container-hoverable'))).get_attribute("aria-label")
openhourlist = openhourstacked.split(",")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]
else:
openhourlist = []
print("No Open Hour list in this merchant! (Not an Exception)")
except NoSuchElementException:
openhourlist = []
print("No Open Hour list in this merchant!")
openhour_trig = True
except WebDriverException:
openhourlist = []
print("Failed to load Open Hour list in this merchant!")
openhour_trig = True是的,这样才能真正避免异常,但是这会像以前一样重复搜索,所以当没有找到元素时,它可能会给出长达6-7秒的搜索时间。在这些术语中,显式等待也没有多大帮助,我认为
发布于 2019-06-02 08:30:19
我知道这是一个很长的问题,我忘记了更新,但我想,我意识到将隐式等待设置为几秒钟,例如:像这个driver.implicitly_wait(2)这样的2秒将有助于将WebDriver搜索限制在最后几秒钟,超过最后几秒钟,它会抛出异常。
发布于 2019-04-22 10:16:49
摘要:
在您的代码中,尝试增加显式等待的时间。它不会拖慢你的速度,但它会防止那些例外。尝试5秒而不是1秒。试试这个
wait(driver,5)
我们使用等待,因为加载DOM需要时间,有时我们需要等待页面/元素加载/隐藏/更改,并且必须根据更改采取行动。
显式等待所做的是等待到给定的时间,以满足预期的条件,并每500毫秒检查一次条件是否满足。这样,在执行下一个任务之前,您将损失最大500毫秒的时间。如果条件没有及时满足,它将抛出一个超时异常。明确的等待并不能解决所有的问题。
您仍然需要检查可能出现的异常,并在发生这种情况时决定如何处理。有些站点的加载速度很慢,或者您的带宽有时很低。那你就没办法加快进程了。
您必须首先分析页面,并确定预期的内容。如果您正在等待一个元素出现,但是它有可能不存在,那么您应该相应地处理异常。
如果您正在检查页面中是否存在一个元素,那么最好不要等待该元素,而是尝试使用find_elements_并检查列表的大小。这样你就可以避免异常,而且速度会更快。
driver.find_elements(By.ID, "locator").size()>0发布于 2019-04-22 09:24:53
是的,显式等待(webdriver )解决了这一问题。否则,简单的方法是创建一个具有时间秒的for循环,并在循环中写入find元素,因此即使失败,它也会检查180秒并写入超出预期等待时间的条件。
for (int second = 0; second < 60; second++) {
try {}
catch (WebDriverException we)
{}
if (second >= 60) {
//write failure
}https://stackoverflow.com/questions/55791972
复制相似问题