Gostaria de extrair dados da segunda página deste painel do Power BI . Para obter os dados de um mês específico, preciso definir a data em um segmentador:
No entanto, quando expando um elemento de ano para exibir os elementos do mês, alguns ficam fora de vista e, portanto, não são renderizados. Portanto, preciso rolar a tela para baixo no segmentador. No entanto, ainda não encontrei um método que funcione.
Antes de dar mais detalhes, é assim que chego à página desejada e expando o segmentador:
# Selenium resources
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
# Driver service
driver_file = r"d:\dev\selenium\msedgedriver.exe" # or whatever driver is available
service = Service(driver_file)
# Browser options
options = Options()
options.add_experimental_option("detach", True)
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--inprivate")
# Open browser
driver = webdriver.Edge(service = service, options = options)
# Get URL
url = "https://app.powerbi.com/view?r=eyJrIjoiZWIzNDg3YzUtMGFlMC00MzdmLTgzOWQtZThkOWExNTU2NjBlIiwidCI6IjQ0OTlmNGZmLTI0YTYtNGI0Mi1iN2VmLTEyNGFmY2FkYzkxMyJ9"
driver.get(url)
# Proceed to next page
driver.find_element(By.XPATH, '//button[@aria-label="Próxima Página"]/i').click()
# Open date slicer
driver.find_element(By.XPATH, '//div[@class="slicer-dropdown-menu"]/i')
# Expand month options for a year, e.g. 2024
(driver \
.find_element(By.XPATH, '//div[@class="slicerItemContainer" and @title="2024"]/div[@class="expandButton"]') \
.click())
E assim:
Mas, do jeito que está, não posso selecionar nenhum mês além de março.
O fatiador não se move quando executo um trecho de JavaScript:
slicer_container = driver.find_element(By.XPATH, '//div[@class="slicerContainer"]')
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", slicer_container)
Tentar rolar para baixo com as teclas gera uma ElementNotInteractableException:
from selenium.webdriver.common.keys import Keys
scroll_container = driver.find_element(By.CLASS_NAME, "scroll-bar")
scroll_container.send_keys(Keys.DOWN)
ElementNotInteractableException: Mensagem: elemento não interativo (Informações da sessão: MicrosoftEdge=135.0.3179.85)
ActionChains produzem o mesmo erro:
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
actions = ActionChains(driver)
actions.move_to_element(scroll_bar).click().send_keys(Keys.PAGE_DOWN).perform()
ElementNotInteractableException: Mensagem: elemento não interativo (Informações da sessão: MicrosoftEdge=135.0.3179.85)
E, por fim, tentei usar uma transformação de estilo, mas ela só consegue rolar o elemento visualmente e não aciona a renderização dos próximos itens do segmentador.
visible_group = driver.find_element(By.CLASS_NAME, 'visibleGroup')
driver.execute_script(f'arguments[0].style.transform = "translateY(-60px)";', visible_group)
No geral, não tenho a mínima ideia do que fazer. Alguma ideia? Sinta-se à vontade para pedir mais detalhes.