Edit:
I solved it by doing a find_elements_by_xpath and then using a try, catch for all elements till no error and break.
To anyone reading this question. I tried every solution here and it didn't work. The solutions were correct, the error or problem was there were multiple elements with the same xpath.
By selecting the the first element I was selecting something which was not interactable.
Getting an error when trying to click or send_keys to an input element.
st = driver.find_element_by_xpath('//input[contains(#id, "st")]')
# Element found
st.send_keys(str(amt))
# Error element not interactable
st.click()
# error element not interactable
The element:
<input id="st" type="text" value="" maxlength="7" tabindex="0">
I am able to interact and send keys to another element in the same row as this on the webpage.
Traceback:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Volumes/coding/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
self._execute(Command.CLICK_ELEMENT)
File "/Volumes/coding/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "/Volumes/coding/venv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/Volumes/coding/venv/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
(Session info: chrome=90.0.4430.72)
Any idea on how to solve or why I am running into this error?
Don't know the exact reason why the element is not interacting but you can add text to input box using JavaScript. There is a class in Selenium which allows to execute JavaScript code in browser. Do somethin like this:
script = "arguments[0].value="+str(amt)
driver.execute_script(script,st)
driver.execute_script("arguments[0].click()",st)
This will set the value of input box to the given string.
In C#:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string script = "arguments[0].value="+amt.toString();
js.executeScript(script,st)
//to click
js.executScript("arguments[0].click()",st)
Hope it will work.
Related
I am running some testing on our website using selenium.
At the login page I would like to target the login button and click it.
the source code of the page looks like this:
I am trying to target the second button that has the class=OTSigninButton by using its xpath.
so here is the python code.
time.sleep(5)
element = driver.find_element_by_xpath('//*[#id="root"]/div/div[1]/div/svg[2]/path')
element.click()
but when I run the code I get the following error:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[#id="root"]/div/div[1]/div/svg[2]/path"}
(Session info: chrome=91.0.4472.106)
Here is the weird part. The login page has 2 buttons, their xpath is similar as its a list.
the first button is:
//*[#id="root"]/div/div[1]/div/svg[1]/path
and the second button(the one I want to target) is
//*[#id="root"]/div/div[1]/div/svg[1]/path
As both of them has the id=root, if I find_element_by_id and target root, I am able to click on the first button.
Here is where I am struggling a lot, how can I use the xpath to target the second button?
thank you so much for your time and help guys.
EDIT: Full error
Traceback (most recent call last):
File "test.py", line 17, in <module>
element = driver.find_element_by_xpath("//*[local-name()='svg' and contains(#class, 'OTSigninButton')]/title")
File "/Users/<user>/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "/Users/<user>/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "/Users/<user>/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/Users/<user>/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[local-name()='svg' and contains(#class, 'OTSigninButton')]/title"}
(Session info: chrome=91.0.4472.106)
class=OTSigninButton
is a attribute of SVG. These are special tags, you can not just write their tag name in console and locate them.
try this instead :
//*[local-name()='svg' and contains(#class, 'OTSigninButton')]
By using selenium click, I'm looking to auto download the subtitles that has 'TXT Korean' in their button tags in the webpage source. I am trying to collect Korean subtitles data for data collection.
the code below opens the website fine, but wouldn't click the 'TXT 한국어' part and giving me errors.
The sourcecode from the website
<button type="button" class="ma-1 download-button v-btn v-btn--depressed v-btn--flat v-btn--outlined theme--light v-size--default primary--text" data-title="[TXT] 한국어"><span class="v-btn__content"><i aria-hidden="true" class="v-icon notranslate v-icon--left material-icons theme--light">save_alt</i><button type="button" class="primary v-btn v-btn--depressed v-btn--rounded theme--light v-size--x-small"><span class="v-btn__content">TXT</span></button></span></button>
Python Code
from selenium import webdriver
driver = webdriver.Chrome(r'C:/Users/ccc/Desktop/chromedriver.exe')
driver.get('https://downsub.com/?url=https%3A%2F%2Fwww.ted.com%2Ftalks%2Frachel_kleinfeld_a_path_to_security_for_the_world_s_deadliest_countries%3Flanguage%3Dko%27language%3D%27ko%2r')
elements = driver.find_element_by_xpath("//div[#class='layout justify-start']//button[#data-title='[TXT] 한국어']")
elements.click()
ERROR
Traceback (most recent call last):
File ".\down.py", line 5, in <module>
elements = driver.find_element_by_xpath("//div[#class='layout justify-start']//button[#data-title='[TXT] 한국어']")
File "C:\Users\ccc\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "C:\Users\ccc\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\ccc\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Users\ccc\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[#class='layout justify-start']//button[#data-title='[TXT] 한국어']"}
(Session info: chrome=85.0.4183.121)
PS C:\Users\ccc\Desktop> [18904:19076:0928/165026.096:ERROR:ssl_client_socket_impl.cc(963)] handshake failed; returned -1, SSL error code 1, net_error -113
[18904:19076:0928/165026.332:ERROR:ssl_client_socket_impl.cc(963)] handshake failed; returned -1, SSL error code 1, net_error -113
[7460:6468:0928/165026.860:ERROR:device_event_log_impl.cc(208)] [16:50:26.860] Bluetooth: bluetooth_adapter_winrt.cc:1074 Getting Default Adapter failed.
I rewrote your code in Java, the code worked fine, no error happened.
So, just according to your below error message, there are some suggests you could try
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[#class='layout justify-start']//button[#data-title='[TXT] 한국어']"}
try this kind of xpath expression
"//button[contains(#data-title,'[TXT]') and contains(#data-title,'한국어')]"
scroll down to the element before clicking on it
driver.execute_script("arguments[0].scrollIntoView();", elements)
elements.click()
Like #Peter answered, let me give you little more insight, Your desired element is not displaying in current view, That's why Selenium is throwing you this exception.
You need to scroll down to that element and then click it.
It will do the trick.
elements = driver.find_element_by_xpath("//div[#class='layout justify-start']//button[#data-title='[TXT] 한국어']") //Element declaration
driver.execute_script("arguments[0].scrollIntoView();", elements) //Scroll down to that element
elements.click() //Click on element
I am trying to scroll to the bottom of the page, as I usually do. But on this website it seems not to work. It's one of those where you need to scroll to the bottom in order to load new links.
This is the command I am using:
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
The error I am getting is:
Traceback (most recent call last):
File "/somePathTo/someProgram.py", line 12, in <module>
browser.execute_script("window.scrollTo(0,document.body.scrollHeight);")
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 636, in execute_script
'args': converted_args})['value']
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'offsetTop' of null
(Session info: chrome=73.0.3683.86)
(Driver info: chromedriver=72.0.3626.69 (3c16f8a135abc0d4da2dff33804db79b849a7c38),platform=Mac OS X 10.14.3 x86_64)
Any other scroll does not work as well, something is wrong with the JS script...
I don't know what element is null and therefore can't have the 'offsetTop' property... maybe I should identify some element that can have that property, but I don't know much more about JS than this script
EDIT:
I did solve my specific problem with this code
browser.execute_script('arguments[0].scrollIntoView(true);', target)
where target is an element to the bottom. However, I would like to know what the issue is with the JS code.
I have to send the string to the textfield in the webpage .
I tried to access it by xpath but the xpath keeps on changing everytime I open the webpage newly. So I decided to access it using class name or tag name. But I am getting an error that the keys can not be passed to the access field.
HTML of the textfiled in the webpage:
<div class = "SearchBox">
<input aria-label = 'xyz' placeholder = 'abc'>
</div>
I tried with these lines of code but none of it is working:
text = driver.find_element_by_xpath('//div[contains(#class,'SearchBox')] and input[contains(#aria-label,'xyz')]')
text = driver.find_element_by_class_name('SearchBox')
text = driver.find_element_by_xpath("//div[#class='SearchBox']/input")
text = driver.find_element_by_xpath("//div[#class='SearchBox']/input[contains(#aria-label,'Combobox expanded. Use arrow keys to select available options or type to search.') and #dojoattachpoint='_searchInput']")
What am I doing wrong? Kindly help.
Error Log:
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
l.send_keys("abcdef")
File "C:\Users\Pavan-Kumar\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 479, in send_keys
'value': keys_to_typing(value)})
File "C:\Users\Pavan-Kumar\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
return self._parent.execute(command, params)
File "C:\Users\Pavan-Kumar\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 314, in execute
self.error_handler.check_response(response)
File "C:\Users\Pavan-Kumar\AppData\Local\Programs\Python\Python35\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: chrome=65.0.3325.146)
(Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 10.0.17134 x86_64)
HTML Code Pic:
The xpath that you jave written contains identifiers of both the div tag and the input tag. How will Selenium understand that you are trying to access the input field!!!!
If you are trying to use the div tag as an anchor to reach the input tag, your xpath should look something like this...
//div[#class='SearchBox']/input
The below xpath should help you as per the html structure image you shared.
//div[#class='SearchBox']/input[contains(#aria-label,'expanded') and #dojoattachpoint='_searchInput']
New to python and Selenium and programming for that matter.
I am trying to automate selenium to hit a specific link. In this case, I want it to hit the link associated with the link text "B":
<li>B
on this website:
http://www.lw.com
I am using this code:
def get_single_link_using_find_elements_by_link_name(url, link_name):
driver = webdriver.Firefox()
driver.get(url)
driver.implicitly_wait(10)
time.sleep(20)
element = driver.find_element_by_link_text(link_name)
element.click()
I added some wait conditions, because I thought the problem might have been a rendering problem, but they didnt help.
I am getting the following error:
Traceback (most recent call last):
File "C:\Python27\programs\selenium commands.py", line 50, in <module>
get_single_link_using_find_elements_by_link_name(url, link_name)
File "C:\Python27\programs\selenium commands.py", line 47, in get_single_link_using_find_elements_by_link_name
element = driver.find_element_by_link_text(link_name)
File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 237, in find_element_by_link_text
return self.find_element(by=By.LINK_TEXT, value=link_text)
File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 671, in find_element
{'using': by, 'value': value})['value']
File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 156, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\errorhandler.py", line 147, in check_response
raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: u'Unable to locate element: {"method":"link text","selector":"B"}'
Oddly enough, the same code WORKS on the following url, which is part of the same site:
http://www.lw.com/people?searchIndex=A
Any ideas?
Your code works for me, when I pass it a page that has the alphabetic listing index. This means that you're passing the wrong variables to the function-- the page that you're passing in, doesn't have a link named 'B', plain and simple.
You can check whether or not the alphabetic thing is on the page by calling driver.find_element_by_id("IndexControl1"). IndexControl1 is the name of the id in which the alphabetic thing is contained.
alphabet = driver.find_element_by_id("IndexControl1")
link_b = alphabet.find_element_by_link_text("B")
Incidentally, something else to watch out for is that if you're already on the page with "B" selected, e.g. http://www.lw.com/people?searchIndex=B&esmode=1, the letter B does not show up as a link and you will end up with a NoSuchElementException in this case, as well.
I think that covers pretty much every case where NoSuchElementException could pop up. Good luck.