当前位置: 首页 > 知识库问答 >
问题:

如何在隐藏类中通过pythom硒选择一个选项?

涂玉韵
2023-03-14

我正在用Selenium解析一个网站。

我需要在隐藏类中选择一个选项。该部分的Html代码:

                                    <div class="search region">
                                        <div class="input-group">
                                            <div class="cec-select">
                                                <select tabindex="-1" class="select2-hidden-accessible"
                                                        aria-hidden="true"><option></option><option value="value_1">text_1</option><option value="value_2">text_2</option></select>
                                                <script>$(function () {
                                                        $('.cec-select select').select2({
                                                            placeholder: "Выберите субъект",
                                                            "language": {
                                                                "noMatches": function () {
                                                                    return "Select a subject";
                                                                }
                                                            }
                                                        }).change(function () {
                                                            window.open($(this).val(), '_blank');
                                                        });
                                                    });</script>
                                            </div>
                                            <br>
                                        </div>
                                    </div>

我尝试像往常一样通过选择功能选择一个选项:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome(executable_path='./chromedriver', chrome_options=chrome_options)

driver.get('url')

regions = Select(driver.find_element_by_class_name("select2-hidden-accessible"))
regions.select_by_index('2')

我得到了这个错误消息:ElementNotInteractiableException:message:element notinteractiable:element当前不可见,可能无法操作。

完整的错误消息:

ElementNotInteractableException           Traceback (most recent call last)
<ipython-input-28-7e06e646520e> in <module>
----> 1 regions.select_by_index('2')
~\Anaconda3\lib\site-packages\selenium\webdriver\support\select.py in select_by_index(self, index)
     99         for opt in self.options:
    100             if opt.get_attribute("index") == match:
--> 101                 self._setSelected(opt)
    102                 return
    103         raise NoSuchElementException("Could not locate element with index %d" % index)
~\Anaconda3\lib\site-packages\selenium\webdriver\support\select.py in _setSelected(self, option)
    210     def _setSelected(self, option):
    211         if not option.is_selected():
--> 212             option.click()
    213 
    214     def _unsetSelected(self, option):
~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in click(self)
     78     def click(self):
     79         """Clicks the element."""
---> 80         self._execute(Command.CLICK_ELEMENT)
     81 
     82     def submit(self):
~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in _execute(self, command, params)
    631             params = {}
    632         params['id'] = self._id
--> 633         return self._parent.execute(command, params)
    634 
    635     def find_element(self, by=By.ID, value=None):
~\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
    319         response = self.command_executor.execute(driver_command, params)
    320         if response:
--> 321             self.error_handler.check_response(response)
    322             response['value'] = self._unwrap_value(
    323                 response.get('value', None))
~\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
    240                 alert_text = value['alert'].get('text')
    241             raise exception_class(message, screen, stacktrace, alert_text)
--> 242         raise exception_class(message, screen, stacktrace)
    243 
    244     def _value_or_default(self, obj, key, default):
ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated

我想,我应该先在选项下运行一个脚本,但我不知道该怎么做。

共有2个答案

卜勇
2023-03-14

您可以尝试这种方法。查找元素由X路径

public void selectFromDropdown(){

// Find the size of dropdown list items.

List <WebElement> dropdownSize = findElementsByXpath(".//select[@class='select2-hidden-accessible']//option");

// Iterate thru each dropdown value and click each of them.

if(dropdownSize.size() > 0){
    for(int i=1; i<= dropdownSize.size(); i++){
        findElementByXpath(".//select[@class='select2-hidden-accessible']")
        findElementByXpath(".//select[@class='select2-hidden-accessible']//option["+i+"]").click();
        }
    }
}

您可以通过添加try/catch并在从下拉列表中选择特定值后中断循环来进一步改进它。

戚哲
2023-03-14

解决了这个问题。首先,我点击文本字段,因此所有选项都在站点上可见。

driver.find_elements_by_xpath("//*[contains(text(), 'Выберите субъект')]")[2].click()

单击之前 单击后

在html代码中,选项仍然在隐藏类中,我仍然不能选择它们。但是我注意到在我点击文本字段后出现了一些新的html代码。这个新片段复制了我需要的所有选项。他们现在都在李的标记下。

<iframe aria-hidden="true" frameborder="0" name="ym-native-frame" style="opacity: 0 !important; width: 0px !important; height: 0px !important; position: absolute !important; left: 100% !important; bottom: 100% !important; border: 0px !important;" title="ym-native-frame"></iframe><ym-measure class="ym-viewport" style="display: block; top: 0px; right: 0px; bottom: 0px; left: 0px; height: 100vh; width: 100vw; position: fixed; transform: translate(0px, -100%); transform-origin: 0px 0px;"></ym-measure><ym-measure class="ym-zoom" style="bottom: 100%; position: fixed; width: 100vw;"></ym-measure><span class="select2-container select2-container--default select2-container--open" style="position: absolute; top: 1416.33px; left: 844.99px;"><span class="select2-dropdown select2-dropdown--below" dir="ltr" style="width: 350px;"><span class="select2-search select2-search--dropdown"><input autocapitalize="off" autocomplete="off" autocorrect="off" class="select2-search__field" role="textbox" spellcheck="false" tabindex="0" type="search"/></span><span class="select2-results"><ul aria-expanded="true" aria-hidden="false" class="select2-results__options" id="select2-42bc-results" role="tree"><li aria-selected="false" class="select2-results__option select2-results__option--highlighted" id="id_1" role="treeitem">text_1</li><li aria-selected="false" class="select2-results__option" id="id_2" role="treeitem">text_2</li></ul></span></span></span></body></html>
 类似资料:
  • 我有两个<代码> 当用户从第一个选择框中选择一个值时,我希望第二个选择框只显示连接的值。 我的代码: 因此,当用户从第一个选择框M中选择“test1”时,他在第二个选择框上只会看到“test2”、“test3”和“test4”;第一个框中的“test2”将在第二个框中显示“test6”、“test7”和“test8”。 如何使用JavaScript解决此问题?

  • 问题内容: 我是Angular的新手,正在尝试ng-options。在我的控制器中,我有: 在我的模板中,我有: 根据视图,我想隐藏“读取”或“写入”。所以在我的控制器中,我还有另一个标志来指示它是什么视图。在使用ng- options之前,我有一个普通的select下拉列表,并做了如下操作: 有没有办法用ng-options做到这一点?谢谢。 问题答案: 您可以在ngOptions表达式中使用过

  • 问题内容: 我有几个随机块。每当一个块落在新行中时,我都会使它看起来不同。当用户单击按钮时,我隐藏了的几个块,并且出现了问题。该选择也算隐藏要素。 有没有办法忽略这些特定的块,以便每一行都具有不同的样式?这是类似情况的示例。 我专门在寻找纯CSS解决方案。 请为您的答案提供小提琴! 而且我无法永久删除这些块,我的用户可以选择单击按钮时过滤文件,这就是隐藏和显示方案的原因。 问题答案: 当用户单击按

  • 问题内容: 这应该工作: 它可以在Firefox中运行,但不能在Chrome中运行(可能未在IE中运行,未经测试)。 一个更有趣的示例: 是将选项元素与DOM分离的唯一选择吗?我需要稍后再显示给他们,所以这不会很有效。 问题答案: 不幸的是,您不能在所有浏览器中隐藏元素。 在过去,当我需要这样做时,我就设置了它们的属性,就像这样… 然后,我使用了这段CSS,在浏览器中支持隐藏的位置…

  • 问题内容: 好的,一段时间以来,我一直在寻找答案,但我遇到的所有问题(甚至在搜索javascript时)都与jQuery结合在一起!没人再使用普通的javascript吗?!? 因此,我想要一个下拉列表(使用多个选项进行选择)。选择某个选项后,我希望显示一个隐藏的div。 然后,我尝试使用以下JavaScript代码: 我猜我的问题出在选项中的onClick触发器上,但是我不确定还有什么用?或者,

  • 在选择域之前: 域名选择后: 当我们启动网站时,它将显示域名下拉列表和选项值为“选择域”。如果我选择“选择域”选项,将显示实际域名。(这意味着在我选择选择域选项之前,不会显示有效域名列表) 我是硒新手,所以我试着使用和可见文本选项选择该选项。 我尝试了下面的python代码。但它不起作用。 我需要按以下顺序选择: > 选择域按钮 接下来,我需要选择自动隐藏文本“选择域…”选项值。然后将显示域值。(