2017-04-16 55 views
1

這是我的代碼。在Try我正在檢查是否出現特定的文本加載,如果是這樣進一步處理。如果我理解正確,我的代碼在每次加載時顯式等待10秒,然後等待另一個15直到滿足條件?如何查看無法加載條件的頁面? (Selenium。Python)

問題是,如何在加載失敗並拋出異常後看到頁面內容?我想知道爲什麼發生這種情況,頁面上有什麼或缺少什麼。現在我無條件地重新加載同一頁面,但由於它被重新加載,它不是拋出異常的頁面。有沒有辦法從try看到原始頁面?

P.S. while循環只是爲了檢查它的規模。

P.P.S.我也嘗試追加失敗的url到我遍歷的列表。我相信這是一個不好的做法。但是,它會造成什麼樣的危害,什麼纔是最好的解決方案?

driver = webdriver.PhantomJS(executable_path=r'C:\Python3\selenium\webdriver\phantomjs-2.1.1-windows\bin\phantomjs.exe',service_log_path=os.path.devnull) 

while count < 20: 
    for line in q: 


     driver.get(line) 
     try: 
      WebDriverWait(driver, 40).until(EC.text_to_be_present_in_element((By.ID, 'searchProgressText'), 'Search complete')) 

      text=driver.find_element_by_class_name("sortbar").text.encode().decode('ascii','ignore') 

      start = text.find('Cheapest') 
      stop = text.find('Best') 
      date = (line[line.find('SDP0')+5:line.find('&AD')].split('&')) 
      date = date[0]+ ' - ' + date[3][5:] 
      dest = (' - ').join(line[line.find('SO0')+4:line.find('&SDP0')].split('&SD0=')) 
      print() 
      print('count=', count) 
      print(line) 
      print(date) 
      print(dest) 
      print(text[start:stop]) 
      count+=1 

     except: 
      print() 
      print('******') 
      print('******') 
      print("Failure", fcount, line) 
      fcount+=1 
     text=driver.find_element_by_id("searchProgressText").text.encode().decode('ascii','ignore') 

     print(text) 

     print('******') 
     print('******') 
     print() 




     time.sleep(2) 
driver.close() 

此特定行需要太長時間才能加載。從1.5秒到7秒。大多數情況下需要3秒鐘。

driver.get(line) 

可以嗎?我如何影響加載時間?

+0

請爲後續問題創建新問題,而不是編輯原始問題以詢問新問題。 –

回答

1

如何在 加載失敗並拋出異常後看到頁面內容?

通過「查看頁面內容」,我假設您要麼保存屏幕截圖或保存頁面源,所以我會同時顯示這兩個。

但基本上,你捕捉到異常,並在那裏做一些事情。

考慮下面的例子。它會等待15秒,以達到預期的條件。所以它要麼返回一個WebElement的實例,否則會拋出一個TimeoutException。在繼續之前,你可以捕捉到異常並做任何你喜歡的事情。此示例將打印異常詳細信息,打印當前頁面源,並保存屏幕截圖。

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.PhantomJS() 
driver.get(some_url) 
try: 
    wait = WebDriverWait(driver, 15) 
    condition = EC.element_to_be_clickable((By.ID, 'someid')) 
    element = wait.until(condition) 
except TimeoutException as e: 
    print(e) 
    print(driver.page_source) 
    driver.save_screenshot('screen.png') 

我給了一個簡單的例子,因爲你的代碼包含許多其他問題。最好從基礎開始。

+0

嗨,是的,我希望看到該頁面的源代碼,完全如您所示。謝謝。代碼中還有其他什麼問題? –

+0

我看到'text = driver.find_element(By.TAG_NAME,( 「body」))。text.encode()。decode('ascii','ignore')'效率非常低,需要4到11秒來處理這部分。 「)。text.encode()。decode('ascii','ignore')'現在需要0.1秒來處理。 –

1

如果我理解正確,我的代碼在每次加載時顯式等待10秒,然後等待另一個15直到滿足條件?

這是不完全正確的。隱式設置在driver上,並適用於driver實例的生命週期。它在你設置的時候並沒有做任何事情。您可以閱讀the docs以瞭解更多信息,但每次嘗試查找元素時基本上只會等待10秒,並且它不會立即可用。

您正在使用隱含和顯式等待,您不應該使用the docs

警告:不要混合隱式和顯式等待。這樣做會導致無法預測的等待時間。

您應該刪除隱式等待,並根據需要使用顯式等待(WebDriverWait)。

要在加載失敗後查看頁面內容,except中的代碼是未找到預期元素時運行的代碼。你需要把你的代碼找到那裏的頁面或不在頁面上。你沒有詳細說明你想要什麼,所以你可以截圖,將某個元素內的HTML轉儲到日誌等等。這取決於你在找什麼。

+0

感謝您編輯我的問題。它看起來像一團糟。 ( –