I'm trying to use selenium to download reports from Google Ads, the script is working fine until I try to click the Campaign-wide target button in the image, It's not showing in the DOM and selenium can't see it until I click/inspect it that it's accessible.
I tried to switch frames and search for it but to no avail, I have only two frames when I try
iframes = b.driver.find_elements(By.XPATH, "//iframe")
Code:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import csv
class Bot:
def __init__(self, user_data_dir=None, profile_dir=None, csv_filename=None):
self.__service = ChromeService(ChromeDriverManager().install())
self.user_data_dir = user_data_dir
self.profile_dir = profile_dir
self.__options = webdriver.ChromeOptions()
self.__options.add_argument(f"user-data-dir={self.user_data_dir}")
self.__options.add_argument(f"--profile-directory={self.profile_dir}")
self.csv_filename = csv_filename or "data.csv"
self.driver = webdriver.Chrome(service=self.__service, options=self.__options)
def login(self):
self.driver.get("https://ads.google.com")
sleep(1)
try:
# get the sign in button and click it
sign_in_btn = self.driver.find_element(By.XPATH, '//*[@id="header-topbar"]/div/div[3]/div/div[3]/a')
sign_in_btn.click()
sleep(2)
except Exception as e:
print(e)
# if the sign in button is not found, try clicking the drawer menu button and then the sign in button
drawer_btn = self.driver.find_element(By.XPATH, '//*[@id="header-drawer"]/div/div/div/div[1]/div/button')
drawer_btn.click()
sleep(2)
sign_in_btn = self.driver.find_element(By.XPATH, '//*[@id="header-topbar"]/div/div[3]/div/div[3]/a')
sign_in_btn.click()
sleep(2)
finally:
accnt_btn = self.driver.find_element(By.XPATH, '/html/body/div[1]/root/div[2]/nav-view-loader/multiaccount-view/div/div[2]/div/div[1]/material-list/material-list-item[4]/div/div[1]')
accnt_btn.click()
sleep(5)
def do(self):
self.login()
# get the campaigns button dropdown button and click it
campaigns_drpdwn_btn = self.driver.find_element(By.XPATH, '/html/body/div[2]/root/div/div[1]/div/div/div[3]/div/div/awsm-skinny-nav/nav/div[1]/div[3]/awsm-skinny-nav-item[1]/a/material-ripple')
campaigns_drpdwn_btn.click()
sleep(2)
# TODO get all the campaigs lists and click on each one of them
# get a certain campaign and click it
campaign_btn = self.driver.find_element(By.XPATH, '//*[@id="cmExtensionPoint-id"]/base-root/div/div[2]/div[1]/view-loader/campaign-view/tableview/div[6]/ess-table/ess-particle-table/div[1]/div/div[2]/div[3]/ess-cell[2]/campaign-name/campaign-name-generic/a')
campaign_btn.click()
sleep(2)
# campaign more details button
campaign_more_details_btn = self.driver.find_element(By.XPATH, '/html/body/div[2]/root/div/div[1]/div/div/div[3]/div/content-header/deferred-infosnack/infosnack/div/div[1]/review-panel-trigger/button/div[2]')
campaign_more_details_btn.click()
sleep(5)
# get the bid strategy button, using the 'Maximize conversions' text as a span and click it
campaign_bid_strategy_btn = self.driver.find_element(By.XPATH, "//span[contains(text(), 'Maximize conversions')]")
campaign_bid_strategy_btn.click()
sleep(4)
# get the campaign simulator button and click it
campaign_sim_btn = self.driver.find_element(By.XPATH, "//span[contains(text(), 'Campaign simulator')]")
campaign_sim_btn.click()
sleep(2)
# get the campaign simulator target dropdown and click it [%, campaign wide target]
campaign_sim_target_dropdn = self.driver.find_element(By.XPATH, "//span[contains(text(), 'Target scaling')]")
campaign_sim_target_dropdn.click()
sleep(2)
campaign_wide_target_btn = self.driver.find_element(By.XPATH, "//span[contains(text(), 'Campaign-wide target')]")
campaign_wide_target_btn.click()
sleep(2)
I'm trying to get selenium to see the button, any help would be appreciated.
The Solution was to simulate my interaction using ActionChains https://www.selenium.dev/documentation/webdriver/actions_api/,
Code:
select_click = ActionChains(self.driver)
select_click.move_to_element(campaign_sim_target_dropdn)
select_click.send_keys(Keys.ARROW_DOWN)
select_click.send_keys(Keys.ENTER)
select_click.perform()
Then the element was added to the DOM and I was able to access it with XPATH