ElementClickInterceptedException Solutions in Selenium and Python - python-3.x

I'm going to press a button on a website as automated, but meanwhile, something called campaigns(kampanyalar) is preventing it. How can I solve this? I want the other element not to get click property
The error:
ElementClickInterceptedException: element click intercepted: Element <div class="styled__CampaignCardDescriptionTitle-sc-1n4y3hk-2 hulWUi" color="">...</div> is not clickable at point (531, 35). Other element would receive the click: <a class="styled__HeaderMenuItem-sc-126ws66-35 gEoUee" href="/kampanyalar" id="DPE_TR_HOME_BUTTON_HEADERITEM0">...</a>

ElementClickInterceptedException means that the element you want to interact with is not available in Selenium view port.
3 things :
1. Launch the browser in full screen :
driver.maximize_window()
2. scroll till that element using execute_script :
driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_css_selector(.your_css_selector))
3. Use of ActionChains :
ActionChains(driver).move_to_element(driver.find_element_by_id('some id where you want to go')).perform()
Imports you would need :
from selenium.webdriver.common.action_chains import ActionChains

ElementClickInterceptedException can be caused by several reasons.
The most powerful is to click it with JavaScript instead of webdriver click. Like the following:
element = driver.find_element_by_xpath("xpath")
driver.execute_script("arguments[0].click();", element)
However it's better to see what causes this exception.
In case the element is out of the visible screen or some footer element element overlaps it, it is better to scroll that element into the view:
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_xpath("xpath")
driver.execute_script("arguments[0].scrollIntoView();", element)
In some other case this will occur because you are trying to click the element while page is still loading elements so as some other element is currently found on that element. In this case it is better to simply wait until this element becomes clickable. Like this:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "xpath"))).click()
So, it's better to use more user-similar actions according to the specific situation you are facing there and only if no alternatives to use JavaScript clicks

Related

Python Selenium unable to select button in iframe

I'm trying to use selenium 4 to click on a button in an iframe to expose the hidden input fields. Taking hints from the answers here and here, I'm still not quite able to click the desired Vote button on the source site.
Source Site
Python 3.10.5
Imports:
import selenium.webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Current code:
driver = selenium.webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get('https://pnccontests.secondstreetapp.com/ChasChoice_2022/gallery/336759126?group=417500')
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element(By.XPATH, """//*[#id="tncms-block-544689"]/p/iframe""")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[#id="ember2408"]/div[1]/div[2]/div[1]/button'))).click()
Line four is where I'm stumbling to find the button and click it. I've tried a variety of selectors by XPath and CSS identifiers, but am not quite able to get the Vote button to click. Continue to either receive error that the locator cannot be found or stack traces from Selenium timeouts.
Hoping someone can help identify the proper way of selecting the Vote button on that source page.
You can try the following:
driver = selenium.webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get('https://pnccontests.secondstreetapp.com/ChasChoice_2022/gallery/336759126?group=417500')
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element(By.XPATH, "//*[#id='tncms-block-544689']/p/iframe")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ember2286 button"))).click()
Also, I see you used absolute xpaths. It is not a good practice. Try to use relative xpaths instead of absolute ones. They are easy on maintenance, readability, and execution per se.

Python How to Select a Radio button

I'm currently trying to select a radio button on the site linked in the code. I've tried finding it by the xpath, and by the ID, but both routes fail, giving me the 'Unable to locate element error'. So I was wondering if someone where could tell me what I'm doing wrong.
driver = webdriver.Chrome(executable_path="/Users/MrPete/Downloads/chromedriver_win32/chromedriver")
driver.get('https://www.pals.pa.gov/#/page/search')
radio = driver.find_element_by_id('optionsRadios1')
radio.click()
This is the radio button I'm trying to click
Induce WebDriverWait() and visibility_of_element_located() and following xpath.
Use Java scripts executor to click on the element.
code:
driver.get('https://www.pals.pa.gov/#/page/search')
radio=WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"//input[#id='optionsRadios1']/following::span[1]")))
driver.execute_script("arguments[0].click();", radio)
Import following libraries.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Browser snapshot.

Selenium : Unable to locate element

So I'm trying to identify this button to press it, but I get the exception:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
The image below shows the button:
The weird thing, is that I already did identify the login button in the login page, but after I got to the following page, it's like identifying an element isn't possible anymore, could that be because the page doesn't allow for that?
#This one works
driver.find_element_by_class_name("urBtnStdNew").click()
#This one give the exception
driver.find_element_by_id("sapbi_snippet_TABSTRIP_CONTAINER_ITEM_1").click()
#This is the HTML of that element
<span class="urTbsTxtOff">DPD Trend</span></td>
Edit: Thank you guys, I didn't know about iframe's existence, so switching it solved my problem.
iframe = driver.find_element_by_xpath("//iframe[#name='iframe_Roundtrip_9223342']")
driver.switch_to.frame(iframe)
Use WebDriverWait and following xpath to click on the DPD Trend tab.
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
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//td[#class='urTbsLabelOff urBorderBox']/span[#class='urTbsTxtOff'][contains(.,'DPD Trend')]"))).click()
Hamza,
WebDriverWait will not work. As you have stated you have tried using Thread.sleep() and WebDriver still cannot locate the element.
The issue looks to me like it is down to an incorrect element locator being used.
If the button in your screenshot is the one in the red box, and the code in the red box in the element inspector relates to it, then it looks to me like the ID should be TABSTRIP_CONTAINER_ITEM_1_tabStrip_tabstrip-itm-5.
So based on your example above the following code should locate the DPD Trend button and click it:
driver.find_element_by_id("TABSTRIP_CONTAINER_ITEM_1_tabStrip_tabstrip-itm-5").click()
The correct XPath locator would be as simple as:
//span[text()='DPD Trend']
If you will still not be able to locate the element:
double check that it is not in an iframe, if it is - you will need to switch to it prior to finding
double check that it is not hidden in the shadow DOM, if it is - you will need to locate ShadowRoot via execute_script function and cast the result to a WebElement
a good practice is using WebDriverWait for locating the elements as it might be the case they're not immediately available in DOM, check out How to use Selenium to test web applications using AJAX technology article for more details.

How to click an element within an iframe

Currently I am trying to click the "entry-level" link in an iframe, for this website:https://a127-jobs.nyc.gov/index_new.html?category=CAS
Unfortunately, the url does not change if I click entry level, so therefore I am forced to automate.
I am not sure what to do, if the problem is that I have entered the wrong iframe? there seems to be only one, but I could be wrong.
from selenium import webdriver
import time
#webdriver
driver = webdriver.Firefox(executable_path="/Users/alexandrubordei/Desktop/geckodriver")
#get the website
driver.get ("https://a127-jobs.nyc.gov/index_new.html?category=CAS")
time.sleep(10)
#switch to iframe
iframes = driver.find_elements_by_tag_name("iframe")
driver.switch_to.frame(iframes[0])
time.sleep(10)
#click element "entry level"
driver.find_element_by_xpath('//*[#id="ti_S13"]').click()
When I run my code everything seems to function, except the link is not clicked. My search results are not narrowed.
However I do not get any errors. I get an error as:
Process finished with exit code 0
you have to click the a element inside that ID
driver.find_element_by_xpath('//*[#id="ti_S13"]/a').click()
To click() on the element with text as entry-level as the the desired elements are within an <iframe> so you have to:
Induce WebDriverWait for the desired frame to be available and switch to it.
Induce WebDriverWait for the desired element to be clickable.
You can use the following solution:
Code Block:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
driver.get("https://a127-jobs.nyc.gov/index_new.html?category=CAS")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[#id='ptifrmtgtframe' and #name='TargetContent']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Entry-Level"))).click()
Browser Snapshot:
Here you can find a relevant discussion on Ways to deal with #document under iframe

Selenium find_element_by_id fails after loading the page

Here's a simple example:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.dcor.state.ga.us/GDC/Offender/Query")
button = driver.find_element_by_id('submit2')
The last command fails no matter how long I wait (unlike previous questions and answers-a long time after the page loads), but when I'm going to the browser itself(the instance that Selenium created), the green "I agree" button has the id submit2(right click->Inspect element)...
What causes this behavior?
How can I make it work?
That's because form located inside an iframe, so you need to switch to that frame before locating element:
driver.switch_to.frame('iframe-content')
The desired element is within an <iframe> so you need to:
Induce WebDriverWait for the desired frame to be available and switch to it.
Induce WebDriverWait for the desired element to be clickable and you can use the following solution:
Code Block:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"iframe-content")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.oq-sub.btn.btn-success#submit2"))).click()

Resources