如何使用 Python / Selenium webdriver 处理 Angularjs / Javascript 下拉列表?
Posted
技术标签:
【中文标题】如何使用 Python / Selenium webdriver 处理 Angularjs / Javascript 下拉列表?【英文标题】:How to handle Angularjs / Javascript dropdown using Python / Selenium webdriver? 【发布时间】:2016-08-28 07:07:29 【问题描述】:我想在 Chromium 浏览器上使用 Python 和 Selenium webdriver 自动执行一些浏览器任务。我的 python 脚本已经能够登录、导航到子页面/点击几下,然后在表单中插入一些东西。
我的问题是一个强制性的下拉列表,我必须在其中选择一些内容才能继续。我认为该网页当时包含 angularjs / javascript(下面代码中的第三行)来创建下拉列表,但我不知道如何处理。
问题似乎是 1) 定位元素(xpath 有时似乎会改变),以及 2) 我无法单击或发送我找到的键。我还尝试了一些“WebDriverWait”和睡眠命令以及“wait.until(expected_conditions.visibility_of_element_located((By.XPATH, ...))”......到目前为止还没有运气。
是否有可能仅使用 Python 和 Selenium 来解决这个问题? 或者我需要像 Protractor 这样的东西(并且 Protractor 只适用于 Javascript 命令)?我也见过 Pytractor...
我是一个新手,有人可以解释一下解决这个问题的好方法吗?在此先感谢... :)
网页代码如下所示(使用 Firebug/Firepath 获取):
<div class="ng-scope ng-isolate-scope" model-contains-key="true" ref="salutations" cat-input-select="editDetail.salutation">
<div id="s2id_autogen1" class="select2-container form-control ng-untouched ng-valid ng-dirty ng-valid-parse">
<a class="select2-choice select2-default" tabindex="-1" href="javascript:void(0)">
<span id="select2-chosen-2" class="select2-chosen"/>
<abbr class="select2-search-choice-close"/>
<span class="select2-arrow" role="presentation">
<b role="presentation"/>
</span>
</a>
<label class="select2-offscreen" for="s2id_autogen2"/>
<input id="s2id_autogen2" class="select2-focusser select2-offscreen" type="text" role="button" aria-haspopup="true" aria-labelledby="select2-chosen-2"/>
<div class="select2-drop select2-display-none select2-with-searchbox">
<div class="select2-search">
<label class="select2-offscreen" for="s2id_autogen2_search"/>
<input id="s2id_autogen2_search" class="select2-input" type="text" aria-autocomplete="list" aria-expanded="true" role="combobox" spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" aria-owns="select2-results-2" placeholder=""/>
</div>
<ul id="select2-results-2" class="select2-results" role="listbox"/>
</div>
</div>
<select class="form-control ng-untouched ng-valid ng-dirty ng-valid-parse" ng-change="modelChanged(); changeCallback(value: selectValue.value)" ng-readonly="readonly" ng-disabled="disabled" ng-model="selectValue.value" ui-select2="dropdownAutoWidth: 'true', allowClear: 'false'" tabindex="-1" title="" style="display: none;">
<option value=""/>
<!-- ngRepeat: option in options -->
<option class="ng-binding ng-scope ng-isolate-scope" cat-i18n="xxxxxxx.salutation.Mr" value="Mr" ng-repeat="option in options">Mr</option>
<!-- end ngRepeat: option in options -->
<option class="ng-binding ng-scope ng-isolate-scope" cat-i18n="xxxxxxx.salutation.Ms" value="Ms" ng-repeat="option in options">Ms</option>
<!-- end ngRepeat: option in options -->
</select>
<!-- ngIf: infoText -->
</div>
【问题讨论】:
【参考方案1】:为了自动化使用 Angular JS 开发的任何网页,我们必须使用开源工具“量角器”。 Selenium 本身不会支持 Angular JS Web 应用程序自动化。更多Protractor相关信息,请参考以下文章
Testing Angular JS application using Protractor
量角器也使用与 selenium 相同的命令。
希望这会有所帮助。
【讨论】:
以上是关于如何使用 Python / Selenium webdriver 处理 Angularjs / Javascript 下拉列表?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Selenium 和 Python 从 <select> 中选择任何 <options>
python selenium结合PhantomJS对ajax异步页面进行压测或者爬虫