I can't fill card data in selenium python - python

Hi guess, today I struggled with a problem I cant fill card data.https://i.stack.imgur.com/VzN22.png
As I understood it appears cuz of nested html(html in html I'm not good in eng). So what do u supposed to do?
I tried to fill it by id, full xpath, selector etc...
Nothing works.
Some code what I used
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "cardCvc-input"))).send_keys("1234")
data.https://i.stack.imgur.com/VzN22.png

You need to switch to iframe first to access the element.The input element present inside an iframe.
Induce WebDriverWait() and frame_to_be_available_and_switch_to_it() and following css selector.
WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='payment']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "cardCvc-input"))).send_keys("1234")
To come out from iframe you need to switch to default_content.
driver.switch_to.default_content()

Related

Selenium NoSuchFrameException when waiting for combobox input

I have an element that is placed in 2 frames. So I wait for the parent frame to load, switch to it, wait for the child frame to load, switch to it, then i try to access my element. The frame switching throws no error but when I try to access the element within the child frame, it is throwing an selenium.common.exceptions.NoSuchFrameException with no message.
parentF = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.ID, "parent")))
driver.switch_to.frame(parentF)
childF = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.ID, "child")))
driver.switch_to.frame(childF)
program_select = WebDriverWait(driver, 60).until(EC.visibility_of_element_located((By.ID, "xyz")))
selenium.common.exceptions.NoSuchFrameException
...implies that Selenium driven WebDriver instance was unable to locate the <iframe> element.
You have adapted the right approach. Ideally, to locate an iframe you have to induce WebDriverWait inconjunction with expected_conditions set as frame_to_be_available_and_switch_to_it().
However, there can be numerous reasons behind seeing this error and some of the reasons and solutions are as follows:
The desired iframe may be a nested iframe within it's parent iframe. In those cases you have to induce WebDriverWait first to switch to the parent iframe and then to the child iframe as follows:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"parent_iframe_xpath")))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"child_iframe_xpath")))
If you are switching between two sibling iframes then you first need to switch back to the default_content first and then switch to the sibling iframe as follows:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"sibling_iframe_A")))
driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"sibling_iframe_B")))
You can find a detailed discussion in How to address “WebDriverException: Message: TypeError: can't access dead object” and wait for a frame to be available using Selenium and Python
At times multiple iframes can have similar values for same attributes. In those cases, you may need to construct Locator Strategies which identifies the element uniquely using the src attribute as follows:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[#id="iframe_id and #src='iframe_src'"]")))

Click on Pop up

does anyone know how I can get past this pop-up using selenium? When I log into Facebook regularly it doesn't come up but for some reason unknown to me, it keeps firing up when I run my script.
cookie_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='u_0_j_I5']"))).click()
This is the script I'm trying to use to get rid of it but it isn't working
The css selector that you are using:
button[id='u_0_j_I5']
looks dynamic and brittle in nature. What that means is, every time you refresh a page you would see a different id generated from the backend.
I would suggest you use a locator which should be reliable and not too easy to break.
A CSS:
input[data-cookiebanner='accept_button']
or XPath
//input[#data-cookiebanner='accept_button']
but you should be mindful of the uniqueness of the locator.
Please check in the dev tools (Google chrome) if we have unique entry in HTML DOM or not.
Steps to check:
Press F12 in Chrome -> go to element section -> do a CTRL + F -> then paste the xpath/css and see, if your desired element is getting highlighted with 1/1 matching node.
If they are unique, then you can use the below code:
cookie_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[data-cookiebanner='accept_button']")))
cookie_button.click()
Update:
Use the below XPath:
//button[contains(text(),'Allow All Cookies')]
and click it like this:
cookie_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Allow All Cookies')]")))
cookie_button.click()

Problem clicking an href=javascript using selenium web drive python

I am having an problem with clicking an menu item that has an link with an href with selenium web drive.
<a class="a-link-normal" href="javascript:;">Fiction</a>
Here is my code:
driver.find_element_by_xpath('//*[#id="div-fiction"]/span/a').click()
This only seem to hover over the linked name and highlight it but does not trigger the javascript. I tried reading all the other solutions but it all lead to just using the click() method. Does anyone know what is wrong or a different approach to this.
The desired element seems to be a JavaScript enabled element so you need to induce WebDriverWait for the desired element to be clickable and you can use either of the following solutions:
LINK_TEXT:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Fiction"))).click()
XPATH:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[#class='a-link-normal' and contains(.,'Fiction')]"))).click()
You may try this:
driver.execute_script("arguments[0].click();", webelement to click)

Can someone please explain me how to write an xpath for selenium on python?

I'm having trouble clicking on elements in a web page. I'm trying to do this with:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "..........']"))).click()
The question is how can I write xpaths correctly in all situations so that they suit this function?
Here you can find a good tutorial, which will teach you xPath basics. On the webpage when you press F12 the dev tools opens:
Then you click on one of the elemnts and then Ctrl+f. Then the search menu will open:
There you can type xPaths and CSS Selectors to make sure, that you have found the right element. For example:
once you have typed yor xPath , you will see on the right side the number of the elements found, also you can click on up and down buttons to iterate over every element, to see whic exactly element is on number 1,2...
Once you have found the right xPath, just copy it from dev tools and paste in the code like this:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div"))).click()
In this case it will be selected only one element. If you want to wait until all elements, if there are more than 1, just use one of the EC methods, for example:
WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div")))
this will wait for visibility of all elements located by //div xPath.
Hope this helps.

Selenium and iframe in html

Unable to use send_keys() for an iframe. How to select this iframe and which element inside this should be use for send_key()?
and iframe html code
<iframe class="textarea" src="/framework/html/blank.html" style="width: 99%; border-width: 1px; height: 332px;">
#document
<html webdriver="true">
<head>
</head>
<body> … </body>
</html>
</iframe>
How to send the value to description?
One more thing i want to know that this code of frame is not coming when i go for "view page source " in browser?
driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) assuming that driver is a healthy instance of webdriver. To continue with the default content do driver.switch_to.default_content()
EDIT: When you have switched to needed frame, locate your webelement as you always do. I guess (but not sure) in your case this will be a html/body, so
el = driver.find_element_by_xpath('html/body')
should be fine. And perform
el.send_keys('keys_to_send')
EDIT2: Before sending keys you may have to focus on the element (click should do the thing, a child element should appear). Or you can just place the needed text via JS.
driver.execute_script('document.body.innerHTML = "%s"' % text_var)
The Accepted answer works very well for the given question. However I have two reasons for adding one more answer and hope this answer might help someone landing this question with different ask.
Reason 1:
Accepted answer has one way of handling iframes inside a web page. However there are different ways to handle iframes.
By using index position of the frame
By using name of the frame
By using id of the frame
Reason 2:
It uses driver.find_element_by_tag_name("iframe") statement to find iframe element which may not work or return expected iframe web element when there are multiple iframe elements in the same page.
There are many articles out there to explain handling iframes in detail.
http://allselenium.info/handling-iframes-using-selenium-webdriver/
You can switch to the iframe using multiple approaches as per the prevailing condition of the HTML DOM.
If the <iframe> is the only iframe within the DOM Tree you can use the following line of code:
Using TAG_NAME:
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
Locating the <iframe> element with a unique Locator Strategy:
Using css_selector:
driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, "iframe.textarea[src='/framework/html/blank.html']"))
Using xpath:
driver.switch_to.frame(driver.find_element(By.XPATH, "//iframe[#class='textarea' and #src='/framework/html/blank.html']"))
Ideally to switch to 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 either of the following Locator Strategies:
Using TAG_NAME (only iframe present):
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.TAG_NAME, "iframe"))).click()
Using CSS_SELECTOR:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.textarea[src='/framework/html/blank.html']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "element_css_selecor"))).send_keys("character_sequence")
Using XPATH:
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[#class='textarea' and #src='/framework/html/blank.html']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[#class='TlogBtn']/span[#class='mailicn']/img"))).send_keys("character_sequence")
Note : You have to add the following imports :
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Reference
You can find a couple of relevant discussions in:
Switch to an iframe through Selenium and python
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium
selenium in python : NoSuchElementException: Message: no such element: Unable to locate element
In order to handle iframes on a web page you need to switch to the iframes first that are present on the page using this command:
driver.switch_to.frame(frame_id)
This tutorial has a working example of handling iframe using selenium with python which will made you able to get through this issue.

Categories

Resources