2017-12-18 259 views
0

我試圖使用Selenium和Python 3從網站下載文件。這需要在覆蓋窗口上按下確認按鈕。疊加窗口不在iFrame中 - 只是在出現疊加時動態添加HTML - 但Selenium無法通過xPath找到該按鈕,返回NoSuchElementException。我是否錯過任何會導致Selenium無法看到該元素出現在頁面源中的內容?據我所知,Selenium應該能夠找到沒有問題的按鈕。Selenium無法在主窗口中找到元素

#Initialize Driver 
driver = webdriver.Safari() 

cmd = "osascript -e 'tell application \"Safari\" to set bounds of front window to {0, 22, 1500, 1022}'" 
os.system(cmd) 

#Call up seach link 
driver.get(data_url) 

wait_a = WebDriverWait(driver, 15) 
element = wait_a.until(EC.presence_of_element_located((By.ID, "md-input-3"))) 

#Initialize and send login information (defined above) 
username = driver.find_element_by_id("md-input-3") 
password = driver.find_element_by_id("md-input-6") 

username.send_keys(crunchbase_username) 
password.send_keys(crunchbase_password) 

#Click login button 
password.send_keys(Keys.ENTER) 

#Wait for results page to finish loading 
wait = WebDriverWait(driver, 15) 
element = wait.until(EC.title_contains("Signals")) 

time.sleep(2) 

#Press Download Button 
driver.find_element_by_xpath("//button[@aria-label='Export your results']").click() 
time.sleep(2) 

#Press csv button 
driver.find_element_by_xpath("//button[@aria-label='Export to CSV']").click() 
time.sleep(2) 

#Confirm downlaod 
driver.find_element_by_xpath("//*[@id='cdk-overlay-36']/md-dialog-container/confirmation-dialog/dialog-layout/div/md-dialog-actions/div/button[2]").click() 

#Close driver 
#driver.close() 

頁面的源代碼過於複雜和高度程式化的,所以我不會在這裏包括它,但在我的瀏覽器的Web檢查代碼的相關部分的截圖如下。我試圖點擊的元素以藍色突出顯示。

Web Inspector Screenshot

我明白任何幫助。

+0

這是一個可公開分享的URL嗎?問題是什麼?確認下載?這是您試圖找到的截圖中突出顯示的元素嗎? –

+0

你還沒有提及關於哪個'確認按鈕'。 **如何過度複雜和高度風格化**'HTML'作爲'格式化文本'或'圖像'被粘貼時會產生差異 – DebanjanB

回答

0

這是很難說,而不必受到質疑訪問頁面,能看到發生了什麼事情。幾乎沒有一點:

  1. 嘗試css選擇器而不是xpath。它們更健壯,更容易使用,速度更快。
  2. 避免使用動態生成的ID。在你的屏幕截圖中,我甚至無法看到代碼中出現的ID。
  3. 如果您有多個相同類型的元素(例如您的案例中的按鈕),請嘗試獲取某個父級下的所有webelements,然後測試所有這些元素是否具有您正在查找的屬性值。

例如:

elemItems = driver.find_elements_by_css_selector(menuItemSelector) 

for element in elements: 
    if element.text == "export": 
     elemItems[1].click() 

在這裏,你會發現某一類型(按鈕爲例),並選擇一個已是「出口」文本中的所有元素。

0

之前點擊的元素,請執行以下線路:

WebElement element = driver.findElement(By.xpath(" path_of_your_module ")); 
((JavaScriptExecutor) driver). executeScript("argument[0].scrollIntoView(true);", element);