2017-01-30 2 views
2

Я не могу выбрать конкретный элемент на этой веб-странице для автоматизации в Selenium (python).Невозможно выбрать раскрывающееся меню с Selenium в Python

Эти два поля, взятые с веб-страницы, это то, что я ищу:

enter image description here

Когда я щелкнул правой кнопкой мыши и нажал на «проверить элемент,» Я нашел следующий HTML-разметку (ну, подмножество):

<label>Client ID:</label> 
<db-client-combobox default-value="vm.clientId" on-select="vm.onClientSelected(clientId)" class="ng-isolate-scope"> 
    <db-combobox placeholder="Select a client" list="clientNames" default-value="defaultValue" on-select="onClientSelected(value)" mode="longlist" class="ng-isolate-scope"> 
     <div class="input-group combobox dropdown"> 
      <input type="text" class="form-control ng-pristine ng-valid ng-touched" placeholder="Select a client" data-toggle="dropdown" ng-model="itemSelected" ng-change="onInputKeyUp()" ng-focus="onInputFocus()" aria-expanded="false"> 
      <span class="input-group-addon dropdown-toggle btn" id="combobox-list" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> 
<span class="caret"></span> 
      </span> 
      <ul class="dropdown-menu" aria-labelledby="combobox-list"> 
       <!-- ngIf: mode == 'longlist' --> 
       <div class="sf-viewport sf-viewport-biglist real ng-scope" ng-if="mode == 'longlist'" style="overflow: auto; max-height: 300px;"> 
        <div style="margin: 0px; padding: 0px; border: 0px; box-sizing: border-box; height: 67912px;"> 
        </div> 
       </div> 
       <!-- end ngIf: mode == 'longlist' --> 
       <!-- ngIf: mode == 'shortlist' --> 
      </ul> 
     </div> 
    </db-combobox> 
</db-client-combobox> 
</div> &nbsp; 
<div class="form-group"> 
    <label>Agent ID:</label> 
    <input type="text" class="form-control js-call-type ng-pristine ng-valid ng-touched" ng-model="vm.agentId"> 
</div> 

поле «идентификатор клиента» является как раскрывающийся и текстовое поле (это до пользователя, чтобы выбрать ли упомянутый пользователь хочет ввести идентификатор клиента или выберите это из выпадающего меню). Идентификатор агента - это просто текстовое поле для ввода чисел.

Кажется, я не могу выбрать ни в Selenium. Для того, чтобы выбрать идентификатор клиента, например, я попытался следующие команды Python (отдельно):

client_id_field = browser.find_elements_by_css_selector('select') 
client_id_field = browser.find_element_by_css_selector("input.form-control ng-pristine ng-valid ng-touched") 
client_id_field = browser.find_element_by_css_selector("input.form-control.ng-pristine.ng-valid.ng-touched") 
client_id_field = browser.select_by_xpath('/html/body/div[1]/div/div[1]/div/div/div[1]/db-client-combobox/db-combobox/div/input') 
client_id_field = browser.select_by_class_name('form-control ng-pristine ng-valid ng-touched') 

К сожалению, ничего не похоже на работу, и я не знаю, почему. Единственная другая возможность, которую я вижу, - это выбрать ярлыки, то есть <label>Client ID:</label>, а затем сообщить интерпретатору перейти к следующему элементу и выбрать это, хотя я не уверен, какой будет правильный синтаксис.

Может ли кто-нибудь помочь?

UPDATE: после того, как следующее предложение alecxe, чтобы попытаться вставить

client_id_box = browser.find_element_by_xpath("//label[. = 'Client ID:']/following-sibling::db-client-combobox") 

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

selenium.common.exceptions.NoSuchElementException: Message: {"errorMessage":"Una 
ble to find element with xpath '//label[. = 'Client ID:']/following-sibling::db- 
client-combobox'","request":{"headers":{"Accept":"application/json","Accept-Enco 
ding":"identity","Connection":"close","Content-Length":"147","Content-Type":"app 
lication/json;charset=UTF-8","Host":"127.0.0.1:53214","User-Agent":"Python-urlli 
b/2.7"},"httpVersion":"1.1","method":"POST","post":"{\"using\": \"xpath\", \"ses 
sionId\": \"d67f3550-e736-11e6-a1df-2f9c010cd01f\", \"value\": \"//label[. = 'Cl 
ient ID:']/following-sibling::db-client-combobox\"}","url":"/element","urlParsed 
":{"anchor":"","query":"","file":"element","directory":"/","path":"/element","re 
lative":"/element","port":"","host":"","password":"","user":"","userInfo":"","au 
thority":"","protocol":"","source":"/element","queryKey":{},"chunks":["element"] 
},"urlOriginal":"/session/d67f3550-e736-11e6-a1df-2f9c010cd01f/element"}} 
Screenshot: available via screen 

что-то, что поражает меня странно (извините, если это звучит так наивно) заключается в том, что в командной строке указано unable to find element with xpath..., а затем после перечисления xpath, о котором я просил, он также перечисляет множество других жаргонов, которые я не хотел просить. Неужели я не использую максимальную отдачу от отладочной реакции интерпретатора?

ответ

1

Единственная возможная возможность, которую я вижу, - это выбрать ярлыки, то есть идентификатор клиента, а затем передать интерпретатору переход к следующему элементу и выбрать его, хотя я не уверен, какой будет правильный синтаксис.

Это может быть достигнуто с помощью following-sibling axis:

client_id_box = browser.find_element_by_xpath("//label[. = 'Client ID:']/following-sibling::db-client-combobox") 

Затем, когда у вас есть элемент идентификатор клиента окна, вы можете найти внутренний вход:

client_id_input = client_id_box.find_element_by_tag_name("input") 
client_id_input.click() # TODO: you might not need it, please check 
client_id_input.send_keys("Test") 

Для выпадающего списка, вам сначала необходимо открыть его, а затем выбрать желаемый вариант:

client_id_box.find_element_by_id("combobox-list").click() # open the dropdown 
# TODO: select option 

Обратите внимание, что, чтобы сделать вещи более надежными и избежать ошибок времени, вам может потребоваться начать с использования Explicit Waits.

+0

Спасибо за ваш быстрый ответ, алексей. Я попробовал ваше предложение использовать ось «следующий-брат», но у меня все еще появилась странная ошибка. Я обновил свой вопрос, включив в него ответ об ошибке.Не могли бы вы это проверить? Излишне говорить, что я все еще очень новичок в веб-соскабливании. – daOnlyBG

+0

@daOnlyBG уверен, что, если вы используете ожидающие условия 'WebDriverWait' и' presence_of_element_located'? (может быть ошибка времени) – alecxe

+0

Несомненно. Я сделаю это. – daOnlyBG

Смежные вопросы