31

I am working on automating the IdentiGO application for my company, and I'm getting the following error:

Internal Server Error: /identigo
Traceback (most recent call last):
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/maynard/employee/views.py", line 63, in post
    driver.main(employee)
  File "/Users/jane/Code/maynard_env/maynard/employee/driver.py", line 31, in main
    WebDriverWait(driver, 1000000).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div[3]/div/button/span'))).click()
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: Element <span class="ui-button-text"> could not be scrolled into view

Here is my code, with the scripts leading up to this page omitted since they aren't relevant to my problem.

from selenium import webdriver
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, 1000000).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div[3]/div/button/span'))).click()

On the page prior to this code, where the user selects an appointment date and time; I want the script to wait for the "Go" button to be pushed, then click on "Continue" in the following screenshot:

enter image description here

If you would like to see the exact page, go to this url, then you will have to make a series of POST requests using the following info:

  • click schedule a new appointment
  • other
  • vendors and contractors (children)
  • tnvc00047
  • 37204
  • make random appointment date

Any advice would really be appreciated!

Update

Here is a JS Fiddle with the html of the page:

https://jsfiddle.net/khf4tym3/

When I click "view page source", the popup html doesn't show in the source code, so I assume that it is generated with JS.

<div class="ui-dialog-buttonset">
    <button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button" aria-disabled="false">
        <span class="ui-button-text">Continue</span>
    </button>
</div>

Update 2

If I change the line WebDriverWait(driver, 1000000) to WebDriverWait(driver, 30), I get the following error instead:

Internal Server Error: /identigo
Traceback (most recent call last):
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/jane/Code/maynard_env/maynard/employee/views.py", line 63, in post
    driver.main(employee)
  File "/Users/jane/Code/maynard_env/maynard/employee/driver.py", line 34, in main
    element=WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ui-dialog-buttonset']/button[@class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only']/span[contains(.,'Continue')]")))
  File "/Users/jane/Code/maynard_env/env/lib/python3.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

pythonfiddle

code for the project so far, so you can skip the forum entry.

https://jsfiddle.net/93k5s2xg/1/

The working solution:

WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.XPATH, "//div[starts-with(@aria-describedby, 'ui-id-')]//span[@class='ui-button-text' and text()='Continue']"))).click()
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
Lord Elrond
  • 13,430
  • 7
  • 40
  • 80

4 Answers4

40

This error message...

selenium.common.exceptions.ElementNotInteractableException: Message: Element <span class="ui-button-text"> could not be scrolled into view

...implies that the WebDriver instance i.e. driver was unable to scroll the element within the Viewport to invoke click().


First of all, as your usecase is to invoke click() on the element, ideally instead of using presence_of_element_located() you need to use the ExpectedConditions as element_to_be_clickable() as follows:

WebDriverWait(driver, 1000000).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[5]/div[3]/div/button/span'))).click()

You can find a couple of detailed discussions in:


As an alternative, as per the error message, to scroll an element within the Viewport before invoking click() you can also use the Element.scrollIntoView() method.

You can find a detailed discussion in: - What is the difference between the different scroll options?


At this point it is worth to mention, the following methods:

will automatically scroll the element within the Viewport.

You can find a detailed discussion in: - How to scroll a webpage using selenium webdriver in Python without using javascript method execute_script()


This usecase

The button with text as Continue is within the Top Level Content but rendered within a Modal Dialog Box.

DevTools Snapshot:

ModalDialogBox

As the desired element is within a Modal Dialog Box, so to locate and invoke click() on the element you have to induce WebDriverWait for the element_to_be_clickable() and you can use the following Locator Strategy:

  • Using XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[starts-with(@aria-describedby, 'ui-id-')]//span[@class='ui-button-text' and text()='Continue']"))).click()
    
  • 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
    

DevTools Snapshot:

XPath

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
10

Use the following xpath and click on that.

element=WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ui-dialog-buttonset']/button[@class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only']/span[contains(.,'Continue')]")))
element.click()

If above click not work then try below one.

element=WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ui-dialog-buttonset']/button[@class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only']/span[contains(.,'Continue')]")))
element.location_once_scrolled_into_view
element.click()

or you can use javascripts executor to click.

element=WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@class='ui-dialog-buttonset']/button[@class='ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only']/span[contains(.,'Continue')]")))
driver.execute_script("arguments[0].click();", element)

EDITED

Try the below code it is clicking on continue button where both continue and cancel button there.once you click on continue you will another continue button to click.The code i have updated from schedule app.

#Schedule appointment
ele1=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'(//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Schedule")])[1]')))
driver.execute_script("arguments[0].click();",ele1)
#click on continue button
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
#click on second continue button
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()

EDITED Rest of the code.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time

driver=webdriver.Chrome()
driver.get("https://tn.ibtfingerprint.com/")
driver.maximize_window()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@name="IN_PublicMenuSelection"]/span[contains(.,"Schedule a New Appointment")]'))).click()
time.sleep(5)
select=Select(driver.find_element_by_id("varAgency"))
select.select_by_value("OTHR")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAgency"]/span[contains(.,"Go")]'))).click()
element=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varAppType')))
select=Select(element)
select.select_by_value("60")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAppType"][contains(.,"Go")]'))).click()
time.sleep(10)

driver.find_element_by_id("varORI").send_keys("tnvc00047")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectORI"][contains(.,"Go")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"yes")]'))).click()

elements=WebDriverWait(driver,40).until(expected_conditions.presence_of_all_elements_located((By.XPATH,'(//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')))
if(len(elements)>0):
   element=driver.find_element_by_xpath('(//div[@class="fieldentity"]//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')
   element.location_once_scrolled_into_view
   ActionChains(driver).move_to_element(element).click().perform()
   elements[0].click()
   driver.find_element_by_css_selector("div.fieldentity div").click()
   driver.execute_script("arguments[0].click();",element)
   element1=WebDriverWait(driver, 40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]')))
   driver.execute_script("arguments[0].click();", element1)

time.sleep(10)
driver.find_element_by_name("IN_varLocZipCode").send_keys("37204")
WebDriverWait(driver,40).until(expected_conditions.presence_of_element_located((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]'))).click()
ele1=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'(//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Schedule")])[1]')))
driver.execute_script("arguments[0].click();",ele1)
time.sleep(10)
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()

This Code is working fine on chrome browser and windows 10 OS.I have tested couple of times.


from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium import webdriver
from selenium.webdriver.support.select import Select


driver=webdriver.Chrome()
driver.get("https://tn.ibtfingerprint.com/")
driver.maximize_window()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@name="IN_PublicMenuSelection"]/span[contains(.,"Schedule a New Appointment")]'))).click()
element=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varAgency')))
select=Select(element)
select.select_by_value("OTHR")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAgency"]/span[contains(.,"Go")]'))).click()
element=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varAppType')))
select=Select(element)
select.select_by_value("60")
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectAppType"][contains(.,"Go")]'))).click()

WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.ID,'varORI'))).send_keys("tnvc00047")

WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@id="collectORI"][contains(.,"Go")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"yes")]'))).click()


elements=WebDriverWait(driver,40).until(expected_conditions.presence_of_all_elements_located((By.XPATH,'(//form[@id="cjisAcknowledgementForm"]//div[@class="fieldentity"]//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')))

if(len(elements)>0):
   element=driver.find_element_by_xpath('(//form[@id="cjisAcknowledgementForm"]//div[@class="fieldentity"]//i[@class="icon checkbox fa fa-fw fa-square-o fa-2x"])[last()]')
   driver.execute_script("arguments[0].click();",element)
   element1=WebDriverWait(driver, 40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]')))
   driver.execute_script("arguments[0].click();", element1)

WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.NAME,'IN_varLocZipCode'))).send_keys("37204")

WebDriverWait(driver,40).until(expected_conditions.presence_of_element_located((By.XPATH,'//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Go")]'))).click()
ele1=WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'(//button[@class="jquiButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Schedule")])[1]')))
driver.execute_script("arguments[0].click();",ele1)

WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="twoButton continueButton ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
WebDriverWait(driver,40).until(expected_conditions.element_to_be_clickable((By.XPATH,'//button[@class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"]/span[contains(.,"Continue")]'))).click()
KunduK
  • 32,888
  • 5
  • 17
  • 41
  • I'm getting the `selenium.common.exceptions.TimeoutException: Message:` error with each of these. I added an update with the full traceback. Thank you for your help! – Lord Elrond May 10 '19 at 22:53
  • Can you check if there any iframe available on that html page you have posted ? – KunduK May 10 '19 at 22:56
  • I checked in inspector and couldn't find any. – Lord Elrond May 10 '19 at 22:57
  • Ok use your xpath and use the 2nd or 3rd option to check that wether it works? – KunduK May 10 '19 at 23:03
  • I tried using my xpath and I still get the `TimeoutException`. When I set the wait time to 30, I get a timeout, and when I set it to 10,000 I get the original error message. – Lord Elrond May 10 '19 at 23:21
  • Strange indeed.the html you have posted is matched with xpath I have provided.Only thing I suspect if there any iframe.However you have said there is no iframe on that page.I’ll give it a try later.However the number tvnc00047 is showing invalid don’t know why. – KunduK May 10 '19 at 23:30
  • strange that the ori number isn't working for you, since I just confirmed that it works for me. I'm guessing the site is blocking your IP since you aren't in Tennessee (I assume). – Lord Elrond May 10 '19 at 23:41
  • Possibly.since you have posted the button element html However can you take the html of entire page and share us as link so that can review the entire html page if possible? – KunduK May 10 '19 at 23:50
  • I added a JS Fiddle in an update. Also, I'm currently looking for the JS file that inserts the "Continue" button. – Lord Elrond May 10 '19 at 23:59
  • You have provided the wrong html mate.I had ask for the html where continue button present – KunduK May 11 '19 at 21:14
  • When I click "view page source" the Continue button doesn't show up. I'm not sure how to copy the entire html file with the continue button present. – Lord Elrond May 11 '19 at 21:15
  • How did you post the html of the button element earlier that way you can post entire page – KunduK May 11 '19 at 21:18
  • I copied it from the inspector window – Lord Elrond May 11 '19 at 22:31
  • @CalebGoodman : try the Edited option now i have tested on chrome browser and it is working fine on pc. – KunduK May 20 '19 at 17:41
  • The `ele1` part of the script is trying to make an appointment for a time that is no longer valid, so I can't see if the end of your code is working. Also, I don't want that part of the script to be automated. The employee will need to pick a date and time. – Lord Elrond May 31 '19 at 11:28
  • If I remove the 3 lines with `ele1`, the last two lines give me a timeout error. – Lord Elrond May 31 '19 at 11:29
  • Sorry I think I have misunderstood your problem since day 1.I though after click on any appointment you are not able to click on continue button so I provided the code. – KunduK May 31 '19 at 11:35
  • sorry about that :/ – Lord Elrond May 31 '19 at 11:36
  • Give me sometime i'll revert. – KunduK May 31 '19 at 11:38
  • I finally got it! Thanks for your help – Lord Elrond May 31 '19 at 11:39
  • Sorry about that.However to checking at element this should work `WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(@class,'ui-button')]/span[contains(.,'Continue')]"))).click()` – KunduK May 31 '19 at 11:46
2

In case someone still has the issue, I fixed it by setting a window size. Example in Java: driver.manage().window().setSize(new Dimension(5120, 2880));.

Alejandro Duarte
  • 1,365
  • 8
  • 15
0

To resolve this problem I just add this line in my WebDriverManager class for all tests :

driver.manage().window().maximize();
Begoodpy
  • 1,018
  • 3
  • 8
  • 20
user1942990
  • 60
  • 1
  • 6