Olivier Hoen
Olivier Hoen

Reputation: 127

Selenium/Python - Element not reachable by keyboard

I am trying to fill in a form automatically. I have recorded a script with Selenium.

One of the field to populate is the zip code. When I start typing the code, a new window opens to suggest appropriate option (javascript autofill)

I need to select the first item the ul (cf. html below)

I am quite new to Selenium and though I have been reading the Selenium/html documentation I am totally stuck for almost 1 month on this...

Many thanks in advance for your support

My code is as follows and I received the error message "Element is not reachable by keyboard"

elem = driver.find_element_by_id("location_p")
elem.send_keys("75")
first_option = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CLASS_NAME, "selected")))
first_option.send_keys(Keys.RETURN)

**HTML** 

<div id="localisation_left">


<div class="line toDisable">
    <label for="location_p" class="label">Ville ou code postal *</label>
    <div class="field-wrapper location-container">
        <div class="inputWrapper">
            <i id="browserGeoloc" class="icon-geoloc icon-2x blue"></i>
            <div class="loaderGif-small hidden"></div>

                <input class="nude" name="location_p" id="location_p" autocomplete="off" value="Paris 75010" type="text">

                <input name="zipcode" value="" type="hidden">
                <input name="city" value="" type="hidden">
                <script type="text/javascript">
                    var numberOfLocation = 1, numberOfAuthorizedLocation = 1;
                    var cityNewadMultipleLocation = new MultipleLocationNewad('input[name="location_p"]', numberOfLocation, numberOfAuthorizedLocation);
                    cityNewadMultipleLocation.cityAndZipcodeAreSelected = true;
                </script>

            <input name="region" value="" type="hidden">
            <input name="dpt_code" value="" type="hidden">
        </div>
        <ul class="location-list visible" style="top: 43px;">
<li data-region="12" data-dpt-code="75" class="selected">
                <span class="city" title="Paris">Paris</span>&nbsp;<span class="zipcode">75011</span>
            </li>
                    <li data-region="12" data-dpt-code="75">
                <span class="city" title="Paris">Paris</span>&nbsp;<span class="zipcode">75015</span>
            </li>
                    <li data-region="12" data-dpt-code="75">
                <span class="city" title="Paris">Paris</span>&nbsp;<span class="zipcode">75009</span>
            </li>
                    <li data-region="12" data-dpt-code="75">
                <span class="city" title="Paris">Paris</span>&nbsp;<span class="zipcode">75010</span>
            </li>
                    <li data-region="12" data-dpt-code="75">
                <span class="city" title="Paris">Paris</span>&nbsp;<span class="zipcode">75017</span>
            </li>

Upvotes: 7

Views: 21457

Answers (4)

Pranjay Kaparuwan
Pranjay Kaparuwan

Reputation: 921

If anyone faces Element not reachable by keyboard issue, one can also seek below approach:

input_xpath = '//input[@type="file"][@name="files[]"][@class="class_name"]'
input_element = self.driver.find_element_by_xpath(input_xpath)

## to make element visible:
driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";',
                                       input_element)
input_element.send_keys('~\Desktop\Release2.pdf')

Upvotes: 3

Prany
Prany

Reputation: 2133

Try selecting by using Xpath below

elem = driver.find_element_by_id("location_p") elem.send_keys("75")  
first_option = WebDriverWait(driver, 10).until( 
              EC.visibility_of_element_located((By.Xpath, 
              ".//*[@id='localisation_left']/div/div/ul/li[1]"))) 
first_option.click()

Upvotes: 3

yong
yong

Reputation: 13712

You can click on the first option, instead of pressing Enter key

elem = driver.find_element_by_id("location_p")
elem.send_keys("75")

condition = EC.visibility_of_element_located((By.CSS, 
    "label[for='location_p'] + div ul.location-list > li"))

first_option = WebDriverWait(driver, 15).until(condition)

first_option.click()

Upvotes: 8

Madpentiste
Madpentiste

Reputation: 51

I had a similar issue, and the above solution did not work for me (it would throw an invalid syntax error).

  1. I first used the find_element_by_css_selector function, which selects the first occurrence of the element with given attributes. This did not work.

  2. Then I used the find_elements_by_css_selector (notice the s), which returns a list of the elements with given attributes. There were two elements in that list. Of course the first one (with index [0]) was not accessible by keyboard: this is equivalent of doing (1) above. But the second element (with index [1]) was accessible by keyboard.

Problem solved.

Upvotes: 4

Related Questions