Python Селен не может быть прокручен в поле зрения - PullRequest
1 голос
/ 29 апреля 2020

Я автоматизирую какой-то веб-процесс, но столкнулся с какой-то странной проблемой при использовании селена. У меня есть:

<div data-field-name="incident_type_ids" style=""><div class="form-group" data-field-name="incident_type_ids">
  <label class="col-xs-4 control-label">
    Incident Type
    <i class="fa fa-info-circle" rel="tooltip" title="" data-placement="right" data-original-title="The type of incident (On Closure please verify that the original type was valid)"></i>
  </label>
  <div class="col-xs-8 controls">

    <span class="editmode">
      <select name="incident_type_ids" multiple="multiple" data-placeholder="Choose Some Types" class="chosen" style="display: none;"><option class=" " value="1007" title="Asset Theft/Loss">
  Asset Theft/Loss


<ul class="chosen-results"><li class="active-result" data-option-array-index="0" title="Dog">
  Dog
</li><li class="active-result  " data-option-array-index="1" title="Cat">
  Cat
</li><li class="active-result  " data-option-array-index="2" title="Mouse">
  Mouse
</li><li class="active-result  " data-option-array-index="3" title="Hunting">
  Hunting
</li><li class="active-result  " data-option-array-index="4" title="Information">
  Information
</li><li class="active-result  " data-option-array-index="5" title="Intelligence">
  Intelligence
</li><li class="active-result  " data-option-array-index="6" title="Request">
  Request
</li><li class="active-result  " data-option-array-index="7" title="Sky">
  Sky
</li><li class="active-result  " data-option-array-index="8" title="Phishing">
  Phishing
</li><li class="active-result  " data-option-array-index="9" title="Violation">
  Violation
</li><li class="active-result  " data-option-array-index="10" title="DDoS">
  DDoS
</li><li class="active-result  " data-option-array-index="11" title="Engineering">
  Engineering
</li><li class="active-result  " data-option-array-index="12" title="Intrusion">
  Intrusion
</li></ul>

И если я нажимаю и выбираю значение с помощью WebDriverWait

WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@data-field-name='incident_type_ids']"))).click()
WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//ul[@class='chosen-results']//li[contains(.,'Phishing')]"))).click()

Я получаю ошибку:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <li class="result-selected"> could not be scrolled into view

Это не делает никаких смысл, потому что если я заменю Phishing на любое другое значение из выпадающего меню, это будет работать. Так почему же он застревает только на Phising? Это даже далеко не прокрутка, если я заменю ее на Intrusion, она все равно тоже работает

1 Ответ

1 голос
/ 29 апреля 2020

Ошибка предполагает, что вам нужно прокрутить до элемента. Этого можно добиться в селене.

Попробуйте следующие варианты.

1 Используйте javascript executor для прокрутки.

WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@data-field-name='incident_type_ids']"))).click()
element=WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//ul[@class='chosen-results']//li[contains(.,'Phishing')]")))
driver.execute_script("arguments[0].scrollIntoView()", element)
element.click()

2 Использовать свойство селена location_once_scrolled_into_view.

WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@data-field-name='incident_type_ids']"))).click()
element=WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//ul[@class='chosen-results']//li[contains(.,'Phishing')]")))
element.location_once_scrolled_into_view
element.click()

Если вы обнаружите какую-либо ошибку, например, NOT , активируемую щелчком мыши, используйте JS, чтобы нажать на элемент.

WebDriverWait(driver,30).until(EC.element_to_be_clickable((By.XPATH,"//div[@data-field-name='incident_type_ids']"))).click()
element=WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//ul[@class='chosen-results']//li[contains(.,'Phishing')]")))
element.location_once_scrolled_into_view
driver.execute_script("arguments[0].click();", element)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...