我正在尝试使用Python Selenium Chrome驱动程序自动执行Google Maps,我的代码很稳定,可以满足我的需要,但是不是性能时间。
我使用迭代代码通过Google Maps获取商家数据,使用Selenium获取1个商家数据的时间率低于1秒,但是当代码捕获异常时,将花费非常长的时间,例如6-7秒。 / p>
以下是执行时间的摘要:
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
是的,这样可以真正避免Exception,但是像以前一样重复搜索,因此当找不到元素时,它可能会再次进行长达6到7秒的长时间搜索。我认为这些术语
答案 0 :(得分:3)
摘要:
在您的代码中,尝试增加显式等待的时间。不会的 让您放慢脚步,但可以防止出现这些异常情况。尝试5秒而不是1秒。试试这个
wait(driver,5)
我们使用等待是因为加载DOM需要花费时间,有时我们需要等待页面/元素加载/隐藏/更改,并且我们必须根据更改采取行动。
显式等待所做的是,它会在给定的时间里等待预期条件的满足,并每500毫秒检查一次条件是否满足。这样,您在执行下一个任务之前最多损失500毫秒的时间。如果没有及时满足条件,它将抛出超时异常。明确的等待并不能解决您的所有问题。
您仍然需要检查可能的异常,并确定在发生异常时该怎么办。有些网站加载速度慢,或者您的带宽有时很低。这样您就无法加快该过程。
您必须首先分析页面并确定期望的结果。如果您正在等待某个元素出现,但是有可能不存在,那么您应该相应地处理该异常。
如果您要检查页面中是否存在某个元素,那么最好不要等待该元素,而是尝试使用find_elements_
并检查列表的大小。这样一来,您可以避免出现异常情况,而且速度更快。
driver.find_elements(By.ID, "locator").size()>0
答案 1 :(得分:0)
是,显式等待(webdriver wait)解决了这个问题。其他简单方法是创建一个带有timeseconds的for循环并在循环内写入find元素,因此即使失败,它也会检查180秒并写入超出预期等待时间的条件时间
NaN
答案 2 :(得分:0)
我知道这已经是一个很长的问题,需要解决的办法,忘了再次更新,但我认为,我意识到将隐式等待时间设置为几秒钟,例如:2秒driver.implicitly_wait(2)
这样有助于限制WebDriver搜索到最后几秒钟(比最后几秒钟多),它将引发异常