Элемент меняется с дисплея: нет для отображения: блокировать селен питон - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь заполнить форму онлайн, используя селен, и в какой-то момент мне нужно заполнить дату. Я не могу использовать send_keys(), так как это запрещено страницей. Вместо этого, когда я нажимаю на поле даты, появляется всплывающее окно выбора даты, в котором предлагается выбрать год, и я могу сделать это успешно.

После выбора года предыдущее окно удаляется, а новоепоявится приглашение выбрать месяц. Это делается путем установки style с display: none на display: block, а в окне предыдущего года style устанавливается с display: block на display: none.

Проблема в том, что даже если методы нового окна is_displayed() и is_enabled() возвращают True, элементы второго окна при использовании на них is_displayed() возвращают False, даже еслиis_enabled() метод возвращает True.

Я думаю, что мне следует обновить элементы dom моего драйвера, но driver.refresh() возвращает меня к шагу 0, где я должен снова выбрать год.

Это мой код:

# Code for selecting year (Works)
dateWindow = driver.find_element_by_xpath('/html/body/div[9]/div[3]/table')
rows = dateWindow.find_elements_by_tag_name("tr")
rows[1].find_element_by_xpath('//span[text()="%s"]' % str_year).click()

# Code for selecting month (Does not work)
dateWindow = driver.find_element_by_xpath('/html/body/div[9]/div[2]/table')
rows = dateWindow.find_elements_by_tag_name("tr")
rows[1].find_element_by_xpath('//span[text()="%s"]' % str_month).click()

В последней строке я получаю эту ошибку:

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

Это HTML-код страницы перед выбором года:

<div class="datepicker-days" style="display: none;">
   <table class=" table-condensed">
     <thead>
      <tr>
       <th class="prev" style="visibility: visible;">«</th>
       <th colspan="5" class="datepicker-switch">June 1993</th>
       <th class="next" style="visibility: visible;">»</th>
      </tr>
      <tr>
       <th class="dow">Su</th>
       <th class="dow">Mo</th>
       <th class="dow">Tu</th>
       <th class="dow">We</th>
       <th class="dow">Th</th>
       <th class="dow">Fr</th>
       <th class="dow">Sa</th>
      </tr>
     </thead>
     <tbody>
      <tr>
       <td class="old day">30</td>
       <td class="old day">31</td>
       <td class="day">1</td>
       <td class="day">2</td>
       <td class="day">3</td>
       <td class="day">4</td>
       ...
       <td class="day">29</td>
       <td class="day">30</td>
       <td class="new day">1</td>
       <td class="new day">2</td>
       <td class="new day">3</td>
      </tr>
      <tr>
       <td class="new day">4</td>
       <td class="new day">5</td>
       <td class="new day">6</td>
       <td class="new day">7</td>
       <td class="new day">8</td>
       <td class="new day">9</td>
       <td class="new day">10</td>
      </tr>
     </tbody>
     <tfoot>
      <tr>
       <th colspan="7" class="today" style="display: none;">Today</th>
      </tr>
      <tr>
       <th colspan="7" class="clear" style="display: none;">Clear</th>
      </tr>
     </tfoot>
    </table>
</div>
<div class="datepicker-months" style="display: none;">
   <table class="table-condensed">
     <thead>
      <tr>
       <th class="prev" style="visibility: visible;">«</th>
       <th colspan="5" class="datepicker-switch">1993</th>
       <th class="next" style="visibility: visible;">»</th>
      </tr>
     </thead>
     <tbody>
      <tr>
       <td colspan="7">
        <span class="month">Jan</span>
        <span class="month">Feb</span>
        <span class="month">Mar</span>
        <span class="month">Apr</span>
        <span class="month">May</span>
        <span class="month">Jun</span>
        <span class="month">Jul</span>
        <span class="month">Aug</span>
        <span class="month">Sep</span>
        <span class="month">Oct</span>
        <span class="month">Nov</span>
        <span class="month">Dec</span>
       </td>
      </tr>
     </tbody>
     <tfoot>
      <tr>
       <th colspan="7" class="today" style="display: none;">Today</th>
      </tr>
      <tr>
       <th colspan="7" class="clear" style="display: none;">Clear</th>
      </tr>
     </tfoot>
    </table>
</div>
<div class="datepicker-years" style="display: block;">
   <table class="table-condensed">
    <thead>
     <tr>
      <th class="prev" style="visibility: visible;">«</th>
      <th colspan="5" class="datepicker-switch">1990-1999</th>
      <th class="next" style="visibility: visible;">»</th>
     </tr>
    </thead>
    <tbody>
     <tr>
      <td colspan="7">
       <span class="year old">1989</span>
       <span class="year">1990</span>
       <span class="year">1991</span>
       <span class="year">1992</span>
       <span class="year">1993</span>
       <span class="year active">1994</span>
       <span class="year">1995</span>
       <span class="year">1996</span>
       <span class="year">1997</span>
       <span class="year">1998</span>
       <span class="year">1999</span>
       <span class="year new">2000</span>
      </td>
     </tr>
    </tbody>
    <tfoot>
      <tr>
       <th colspan="7" class="today" style="display: none;">Today</th>
     </tr>
     <tr>
      <th colspan="7" class="clear" style="display: none;">Clear</th>
     </tr>
    </tfoot>
   </table>
</div>

Этоэто HTML-код страницы до выбора месяца и после выбора года:

<div class="datepicker-days" style="display: none;">
   <table class=" table-condensed">
     <thead>
      <tr>
       <th class="prev" style="visibility: visible;">«</th>
       <th colspan="5" class="datepicker-switch">June 1993</th>
       <th class="next" style="visibility: visible;">»</th>
      </tr>
      <tr>
       <th class="dow">Su</th>
       <th class="dow">Mo</th>
       <th class="dow">Tu</th>
       <th class="dow">We</th>
       <th class="dow">Th</th>
       <th class="dow">Fr</th>
       <th class="dow">Sa</th>
      </tr>
     </thead>
     <tbody>
      <tr>
       <td class="old day">30</td>
       <td class="old day">31</td>
       <td class="day">1</td>
       <td class="day">2</td>
       <td class="day">3</td>
       <td class="day">4</td>
       ...
       <td class="day">29</td>
       <td class="day">30</td>
       <td class="new day">1</td>
       <td class="new day">2</td>
       <td class="new day">3</td>
      </tr>
      <tr>
       <td class="new day">4</td>
       <td class="new day">5</td>
       <td class="new day">6</td>
       <td class="new day">7</td>
       <td class="new day">8</td>
       <td class="new day">9</td>
       <td class="new day">10</td>
      </tr>
     </tbody>
     <tfoot>
      <tr>
       <th colspan="7" class="today" style="display: none;">Today</th>
      </tr>
      <tr>
       <th colspan="7" class="clear" style="display: none;">Clear</th>
      </tr>
     </tfoot>
    </table>
</div>
<div class="datepicker-months" style="display: block;">
   <table class="table-condensed">
     <thead>
      <tr>
       <th class="prev" style="visibility: visible;">«</th>
       <th colspan="5" class="datepicker-switch">1993</th>
       <th class="next" style="visibility: visible;">»</th>
      </tr>
     </thead>
     <tbody>
      <tr>
       <td colspan="7">
        <span class="month">Jan</span>
        <span class="month">Feb</span>
        <span class="month">Mar</span>
        <span class="month">Apr</span>
        <span class="month">May</span>
        <span class="month">Jun</span>
        <span class="month">Jul</span>
        <span class="month">Aug</span>
        <span class="month">Sep</span>
        <span class="month">Oct</span>
        <span class="month">Nov</span>
        <span class="month">Dec</span>
       </td>
      </tr>
     </tbody>
     <tfoot>
      <tr>
       <th colspan="7" class="today" style="display: none;">Today</th>
      </tr>
      <tr>
       <th colspan="7" class="clear" style="display: none;">Clear</th>
      </tr>
     </tfoot>
    </table>
</div>
<div class="datepicker-years" style="display: none;">
   <table class="table-condensed">
    <thead>
     <tr>
      <th class="prev" style="visibility: visible;">«</th>
      <th colspan="5" class="datepicker-switch">1990-1999</th>
      <th class="next" style="visibility: visible;">»</th>
     </tr>
    </thead>
    <tbody>
     <tr>
      <td colspan="7">
       <span class="year old">1989</span>
       <span class="year">1990</span>
       <span class="year">1991</span>
       <span class="year">1992</span>
       <span class="year">1993</span>
       <span class="year active">1994</span>
       <span class="year">1995</span>
       <span class="year">1996</span>
       <span class="year">1997</span>
       <span class="year">1998</span>
       <span class="year">1999</span>
       <span class="year new">2000</span>
      </td>
     </tr>
    </tbody>
    <tfoot>
      <tr>
       <th colspan="7" class="today" style="display: none;">Today</th>
     </tr>
     <tr>
      <th colspan="7" class="clear" style="display: none;">Clear</th>
     </tr>
    </tfoot>
   </table>
</div>

Есть идеи? Заранее спасибо

1 Ответ

0 голосов
/ 30 октября 2019

Требуемый элемент является динамическим элементом, поэтому при выборе Месяц вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих Стратегий локатора:

  • Использование XPATH:

    dateWindow = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[9]/div[2]/table")))
    rows = dateWindow.find_elements_by_tag_name("tr")
    rows[1].find_element_by_xpath('//span[text()="%s"]' % str_month).click()
    
  • Примечание : необходимо добавить следующееимпорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...