Приведенный ниже фрагмент кода щелкает меню файлов на странице, содержащей лист Excel.

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get(r"foo%20Data%20235.xlsx&DefaultItemOpen=3") # dummy link
driver.find_element_by_css_selector('#jewel-button-middle > span').click() # responsible for clicking the file menu
driver.quit()

И я не знаю, как выбрать первый вариант, т. Е. Вариант загрузки снимка из всплывающего меню. Я не могу проверить элементы всплывающего или выпадающего меню. Я хочу, чтобы файл xlsx был загружен.

enter image description here

3
Avinash Raj 11 Янв 2017 в 05:22

4 ответа

Лучший ответ

Идея состоит в том, чтобы загрузить страницу с PhantomJS, дождаться загрузки содержимого рабочей книги, получить все необходимые параметры для запроса конечной точки обработчика файла загрузки, что мы можем сделать с помощью requests пакет.

Полное рабочее решение:

import json

import requests
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

WORKBOOK_TYPE = "PublishedItemsSnapshot"

driver = webdriver.PhantomJS()
driver.maximize_window()
driver.get('http://www.cbe.org.eg/en/EconomicResearch/Publications/_layouts/xlviewer.aspx?id=/MonthlyStatisticaclBulletinDL/External%20Sector%20Data%20235.xlsx&DefaultItemOpen=1#')

wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, "ctl00_PlaceHolderMain_m_excelWebRenderer_ewaCtl_rowHeadersDiv")))

# get workbook uri
hidden_input = wait.until(EC.presence_of_element_located((By.ID, "ctl00_PlaceHolderMain_m_excelWebRenderer_ewaCtl_m_workbookContextJson")))
workbook_uri = json.loads(hidden_input.get_attribute('value'))['EncryptedWorkbookUri']

# get session id
session_id = driver.find_element_by_id("ctl00_PlaceHolderMain_m_excelWebRenderer_ewaCtl_m_workbookId").get_attribute("value")

# get workbook filename
workbook_filename = driver.find_element_by_xpath("//h2[contains(@class, 's4-mini-header')]/span[contains(., '.xlsx')]").text

driver.close()

print("Downloading workbook '%s'..." % workbook_filename)
response = requests.get("http://www.cbe.org.eg/en/EconomicResearch/Publications/_layouts/XlFileHandler.aspx", params={
    'id': workbook_uri,
    'sessionId': session_id,
    'workbookFileName': workbook_filename,
    'workbookType': WORKBOOK_TYPE
})
with open(workbook_filename, 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
2
alecxe 24 Янв 2017 в 15:35

Проще осмотреть такие элементы (закрывающие выпадающие списки) с помощью FireFox, открыть инструменты разработчика и просто встать на элемент с помощью крейсера мыши после выбора параметра на панели инструментов FireBug (отмечен красным квадратом на рисунке). ) .

enter image description here

Что касается вопроса, локатор, который вы ищете, это ('[id*="DownloadSnapshot"] > span')

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get(r"foo%20Data%20235.xlsx&DefaultItemOpen=3") # dummy link

wait = WebDriverWait(driver, 10)

wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, '[id*="loadingTitleText"]')))

driver.find_element_by_css_selector('#jewel-button-middle > span').click() # responsible for clicking the file menu

download = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '[id*="DownloadSnapshot"] > span')))
driver.get_screenshot_as_file('fileName')
download.click()
2
Guy 19 Янв 2017 в 09:14

Я наблюдал, пока excel полностью не загрузился, меню Файл не показывает никаких опций. Поэтому добавлено ожидание загрузки книги Excel.

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
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains

browser = webdriver.PhantomJS()
browser.maximize_window()
browser.get('http://www.cbe.org.eg/en/EconomicResearch/Publications/_layouts/xlviewer.aspx?id=/MonthlyStatisticaclBulletinDL/External%20Sector%20Data%20235.xlsx&DefaultItemOpen=1#')

wait = WebDriverWait(browser, 10)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "//td[@data-range='B59']")))
element = wait.until(EC.element_to_be_clickable((By.ID, 'jewel-button-middle')))
element.click()
eleDownload = wait.until(EC.element_to_be_clickable((By.XPATH,"//span[text()='Download a Snapshot']")))
eleDownload.click()
sleep(5)
browser.quit()
1
Naveen Kumar R B 20 Янв 2017 в 05:54

Найдите элемент по идентификатору / тегу, проверьте параметры в цикле, выберите тот, который вы хотите, затем нажмите кнопку.

0
F.Moure 24 Янв 2017 в 05:08