【问题标题】:How can I select items from a dropdown list using the console?如何使用控制台从下拉列表中选择项目?
【发布时间】:2021-02-24 07:31:24
【问题描述】:

试图在这里保持我的幽默感 - 我一直在尝试准备代码,这将允许我使用控制台自动完成 Web 表单的不同部分。我不能使用硒。在标记了很多进展之后(借助此处的答案),网站已经更新(使用 Bootstrap?),我的大多数命令现在都不起作用。在此特定项目上,页面上有一个下拉菜单,可显示颜色列表。单击一种或多种颜色将使其在输入框中被选中。我正在尝试通过将代码放入控制台来实现同样的目的。

我尝试重新利用我之前使用的代码,但我认为元素是完全不同的类型。有人可以帮忙吗?下面是下拉列表的代码(我认为我不需要在此处包含 HTML?):

<div class="form-group col-sm-12" element="div"> <label>colour type</label>
  <select name="colourTypes[]" style="width: 100%" data-init-function="bpFieldInitSelect2MultipleElement" data-select-all="false" data-options-for-js="[2,1,5,7,6,13,12,9,10,16,4,15,3,8,11]" class="form-control 
select2_multiple select2-hidden-accessible" multiple="" data-select2-id="10" tabindex="-1" aria-hidden="true" data-initialized="true">

    <option value="" data-select2-id="17">-</option>

    <option value="2" data-select2-id="18">N/A</option>
    <option value="1" data-select2-id="19">Red</option>
    <option value="5" data-select2-id="20">Green</option>
    <option value="7" data-select2-id="21">Blue</option>
    <option value="6" data-select2-id="22">Magenta</option>
    <option value="13" data-select2-id="23">Turquoise</option>
    <option value="12" data-select2-id="24">Maroon</option>
    <option value="9" data-select2-id="25">Olive</option>
    <option value="10" data-select2-id="26">Yellow</option>
    <option value="16" data-select2-id="27">Grey</option>
    <option value="4" data-select2-id="28">Silver</option>
    <option value="15" data-select2-id="29">Other/Unclear</option>
    <option value="3" data-select2-id="30">Crimson</option>
    <option value="8" data-select2-id="31">Dark blue</option>
    <option value="11" data-select2-id="32">Light blue</option>

  </select><span class="select2 select2-container select2-container--bootstrap select2-container--
focus select2-container--below select2-container--open" dir="ltr" data-select2-id="11" style="width: 100%;"><span class="selection"><span class="select2-selection select2-selection--multiple" 
role="combobox" aria-haspopup="true" aria-expanded="true" 
tabindex="-1" aria-disabled="false" aria-owns="select2-colourTypes-9c-results">
<ul class="select2-selection__rendered"><li class="select2-search select2-search--inline">
<input class="select2-search__field" 
type="search" tabindex="0" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" 
placeholder="" style="width: 0.75em;" aria-controls="select2-colourTypes-9c-results">
</li></ul></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>



</div>

【问题讨论】:

  • “添加”是什么意思?喜欢选择吗?
  • 是的。为了清楚起见,我已经编辑了问题(我希望)。
  • @Yesterdec something like this 有帮助吗?请先阅读下半部分“它能为我做什么?”

标签: javascript html forms


【解决方案1】:

是的。一种选择是获取所有选项并遍历它们。

然后,选择所需的选项。

const options = document.querySelectorAll('select[name="colourTypes[]"] option'); // a CSS selector

[...options].forEach((curr) => {
  // Select values of 1, 5, and ''
  if (['1', '5', ''].indexOf(curr.value) !== -1) {
    curr.selected = true;
  }
});
<div class="form-group col-sm-12" element="div"> <label>colour type</label>
  <select name="colourTypes[]" style="width: 100%" data-init-function="bpFieldInitSelect2MultipleElement" data-select-all="false" data-options-for-js="[2,1,5,7,6,13,12,9,10,16,4,15,3,8,11]" class="form-control 
select2_multiple select2-hidden-accessible" multiple="" data-select2-id="10" tabindex="-1" aria-hidden="true" data-initialized="true">

    <option value="" data-select2-id="17">-</option>

    <option value="2" data-select2-id="18">N/A</option>
    <option value="1" data-select2-id="19">Red</option>
    <option value="5" data-select2-id="20">Green</option>
    <option value="7" data-select2-id="21">Blue</option>
    <option value="6" data-select2-id="22">Magenta</option>
    <option value="13" data-select2-id="23">Turquoise</option>
    <option value="12" data-select2-id="24">Maroon</option>
    <option value="9" data-select2-id="25">Olive</option>
    <option value="10" data-select2-id="26">Yellow</option>
    <option value="16" data-select2-id="27">Grey</option>
    <option value="4" data-select2-id="28">Silver</option>
    <option value="15" data-select2-id="29">Other/Unclear</option>
    <option value="3" data-select2-id="30">Crimson</option>
    <option value="8" data-select2-id="31">Dark blue</option>
    <option value="11" data-select2-id="32">Light blue</option>

  </select><span class="select2 select2-container select2-container--bootstrap select2-container--
focus select2-container--below select2-container--open" dir="ltr" data-select2-id="11" style="width: 100%;"><span class="selection"><span class="select2-selection select2-selection--multiple" 
role="combobox" aria-haspopup="true" aria-expanded="true" 
tabindex="-1" aria-disabled="false" aria-owns="select2-colourTypes-9c-results">
<ul class="select2-selection__rendered"><li class="select2-search select2-search--inline">
<input class="select2-search__field" 
type="search" tabindex="0" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" 
placeholder="" style="width: 0.75em;" aria-controls="select2-colourTypes-9c-results">
</li></ul></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>



</div>

【讨论】:

    【解决方案2】:

    我可能需要更清楚地了解您想要做什么,但根据我从您的问题中收集到的信息,我认为您正在寻找一种方法来使用您的控制台填充所有这些字段,特别是这个选择字段。您应该能够通过将其值设置为等于您要选择的选项的值来填充它。

    使用您包含的代码,以下 JavaScript 将选择值为 5 的选项,即“绿色”:

    document.querySelector('select[name="colourTypes[]"]').value = "5";
    // selected  —>  <option value="5" data-select2-id="20">Green</option>
    

    运行此程序后,您甚至可以在控制台中使用以下任一方法进行测试以确保它确实选择了该选项:

    Array.from(document.querySelectorAll('select[name="colourTypes[]"] option')).filter(e => e.selected)[0].value;
    // returns "5"
    Array.from(document.querySelectorAll('select[name="colourTypes[]"] option')).filter(e => e.selected)[0].textContent;
    // returns "Green"
    document.querySelector('select[name="colourTypes[]"]').value;
    // returns "5"
    

    要对多个字段执行此操作,您可以对每个字段执行类似于此方法的操作,然后连续运行它们。这是完成此任务的一种方法。另一种实现这一点的方法——我的首选方法——是创建一个包含所有键/值(字段名称/值)对的 JavaScript 对象,然后循环遍历该对象。这使您以后可以更轻松地调整您的选择和其他字段,而不必担心特定字段是哪种类型的字段。

    让我们在这里看看实际效果:

    const fieldValues = {
      "Full Name": "David Webb",
      "Alias": "Jason Bourne",
      "Food": ["chicken","tacos"],
      "Color": "#663399",
      "DOB": "1970-09-13",
      "Email": "thebourneybunch@gmail.com",
      "Spam": "phone",
      "Places": ["north-america","europe","antarctica"],
      "State": "MO",
      "Bio": "No, it doesn't start to come back. The knot's like everything else, I just found the rope and I did it.\n\nThe same way I can read, I can write, I can add, subtract, I can make coffee, I can shuffle cards, I can set up a chessboard.",
      "Username": "JamesBondWishesHeWasMe",
      "Password": "Kittens4EVER!"
    };
    
    const button = document.querySelector('button');
    button.addEventListener('click', function() {
      // loop through the `fieldValues` object we created to compare your desired values with those of the form fields
      for ([fieldName, value] of Object.entries(fieldValues)) {
        // store all found fields of each field name into a `fields` variable
        const fields = Array.from(document.querySelectorAll(`[name="${fieldName}"]`));
        // ensure that at least one field exists for each requested field name
        if (fields.length) {
          // if the input type permits multiple selected values (e.g. checkbox list, multi-select field)
          if (fields[0].matches && (fields.length > 1 || (fields.length === 1 && fields[0].matches('select[multiple]')))) {
            // store desired value as an array, even if it is a string, (i.e. "0" —> ["0"], ["1","2"] —> ["1","2"])
            const values = [value].flat();
            const isMultiSelect = fields[0].matches('select[multiple]');
            // if the field is a multi-select field, evaluate its child option elements, otherwise, evaluate the actual fields (checkboxes)
            const fieldOptions = isMultiSelect ? Array.from(fields[0].querySelectorAll('option')) : fields;
            // deselect any pre-selected options for fields with the associated field name, using the selected/checked properties accordingly
            fieldOptions.forEach(option => option[isMultiSelect ? "selected" : "checked"] = false);
            // select/check any options/checkboxes that match values from the `fieldValues` object
            fieldOptions.filter(option => values.includes(option.value)).forEach(option => option[isMultiSelect ? "selected" : "checked"] = true);
          } else {
            // if the field type only accepts one value, set it equal to the value from the `fieldValues` object
            fields[0].value = value;
          }
        }
      }
    });
    @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css');
    
    body {
      padding: 30px;
    }
    form {
      display: grid;
      grid-template-columns: 120px 1fr;
      gap: 10px;
    }
    label, input, textarea, select, button {
      font-family: system-ui, arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    select[multiple] {
      height: 130px;
      overflow: hidden;
    }
    textarea {
      height: 90px;
      resize: none;
    }
    label, button {
      font-weight: bold;
    }
    label + div {
      display: flex;
      flex-wrap: wrap;
      gap: 5px 10px;
    }
    label + div > label {
      white-space: nowrap;
    }
    button {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      appearance: none;
      -webkit-appearance: none;
      margin-bottom: 20px;
      padding: 8px 16px;
      background-color: #58f;
      border: none;
      border-radius: 50px;
      font-size: 18px;
      color: #fff;
      cursor: pointer;
    }
    button i {
      margin-left: 10px;
    }
    <button>Fill this form<i class="fas fa-magic"></i></button>
    
    <form>
      <label for="fullName">Full Name</label>
      <input id="fullName" type="text" name="Full Name" placeholder="Clark Kent">
      <label for="alias">Alias</label>
      <input id="alias" type="text" name="Alias" placeholder="Superman (you get the idea…)">
      <label for="favoiteColor">Favorite Color</label>
      <input id="favoiteColor" type="color" name="Color" value="#FF0000">
      <label for="food">I'm craving…</label>
      <select id="food" name="Food" multiple>
        <option value="chicken">Chicken</option>
        <option value="fried-rice">Fried rice</option>
        <option value="pizza">Pizza</option>
        <option value="tacos">Tacos</option>
        <option value="ice-cream">Ice cream</option>
        <option value="pasta">Pasta</option>
      </select>
      <label for="dob">DOB</label>
      <input id="dob" type="date" name="DOB">
      <label for="email">Email Address</label>
      <input id="email" type="email" name="Email">
      <label for="spam">Spam me via…</label>
      <div>
        <label for="spam-email"><input id="spam-email" type="radio" name="Spam" value="email"> Email</label>
        <label for="spam-phone"><input id="spam-phone" type="radio" name="Spam" value="phone"> Phone</label>
    </div>
      <label for="places">I've been to…</label>
      <div>
        <label for="africa"><input id="africa" type="checkbox" name="Places" value="africa"> Africa</label>
        <label for="antarctica"><input id="antarctica" type="checkbox" name="Places" value="antarctica"> Antarctica</label>
        <label for="asia"><input id="asia" type="checkbox" name="Places" value="asia"> Asia</label>
        <label for="australia"><input id="australia" type="checkbox" name="Places" value="australia"> Australia</label>
        <label for="europe"><input id="europe" type="checkbox" name="Places" value="europe"> Europe</label>
        <label for="north-america"><input id="north-america" type="checkbox" name="Places" value="north-america"> North America</label>
        <label for="south-america"><input id="south-america" type="checkbox" name="Places" value="south-america"> South America</label>
    </div>
      <label for="state">Home state</label>
      <select id="state" name="State">
        <option value="" style="display: none;" disabled="disabled" selected="selected">Choose a state…</option>
        <option value="AL">Alabama</option>
        <option value="AK">Alaska</option>
        <option value="AZ">Arizona</option>
        <option value="AR">Arkansas</option>
        <option value="CA">California</option>
        <option value="CO">Colorado</option>
        <option value="CT">Connecticut</option>
        <option value="DE">Delaware</option>
        <option value="FL">Florida</option>
        <option value="GA">Georgia</option>
        <option value="HI">Hawaii</option>
        <option value="ID">Idaho</option>
        <option value="IL">Illinois</option>
        <option value="IN">Indiana</option>
        <option value="IA">Iowa</option>
        <option value="KS">Kansas</option>
        <option value="KY">Kentucky</option>
        <option value="LA">Louisiana</option>
        <option value="ME">Maine</option>
        <option value="MD">Maryland</option>
        <option value="MA">Massachusetts</option>
        <option value="MI">Michigan</option>
        <option value="MN">Minnesota</option>
        <option value="MS">Mississippi</option>
        <option value="MO">Missouri</option>
        <option value="MT">Montana</option>
        <option value="NE">Nebraska</option>
        <option value="NV">Nevada</option>
        <option value="NH">New Hampshire</option>
        <option value="NJ">New Jersey</option>
        <option value="NM">New Mexico</option>
        <option value="NY">New York</option>
        <option value="NC">North Carolina</option>
        <option value="ND">North Dakota</option>
        <option value="OH">Ohio</option>
        <option value="OK">Oklahoma</option>
        <option value="OR">Oregon</option>
        <option value="PA">Pennsylvania</option>
        <option value="RI">Rhode Island</option>
        <option value="SC">South Carolina</option>
        <option value="SD">South Dakota</option>
        <option value="TN">Tennessee</option>
        <option value="TX">Texas</option>
        <option value="UT">Utah</option>
        <option value="VT">Vermont</option>
        <option value="VA">Virginia</option>
        <option value="WA">Washington</option>
        <option value="WV">West Virginia</option>
        <option value="WI">Wisconsin</option>
        <option value="WY">Wyoming</option>
      </select>
      <label for="bio">Bio</label>
      <textarea id="bio" name="Bio" placeholder="Tell us a bit about yourself…"></textarea>
      <label for="username">Username</label>
      <input id="username" type="text" name="Username">
      <label for="password">Password</label>
      <input id="password" type="password" name="Password">
    </form>

    编辑:2021 年 2 月 22 日

    好的,我知道您在这里尝试做什么,从多选字段中选择多个值。我的原始脚本没有考虑字段类型(例如复选框列表和多选字段)的多个选定值,但稍作调整,我们也可以添加对这两种字段类型的支持!请检查上面的 sn-p,因为我现在已经对其进行了更新以反映这一点。

    本质上,我们检查这些字段类型中的任何一种,如果它们存在,我们会从它们的字段中清除任何预设值,然后循环遍历所需输入的数组(单个字符串将变成长度为 1 的数组,包含该字符串)并选择每个所需的值。使用三元表达式,我通过查看选择的选项标签后代并将selected 属性设置为真/假,而不是checked 属性来考虑多选字段和复选框列表。

    【讨论】:

    • 另外,如果这是您需要定期自动填充的表单,只需将这种 JS 自动完成功能与 TamperMonkey 或 GreaseMonkey 等浏览器内扩展(取决于您使用的浏览器)相结合,并且每当您访问该页面时,该扩展程序都会自动填充这些字段。
    • 非常感谢克里斯和布兰登。 Brandon 我想我可以使用你的建议让 JavaScript 选择值为 5 的选项。恐怕我不明白关于在多个字段中选择选项的不同部分(可能不得不回到那个!) .在脚本上选择值为 5 的选项,我相信只能选择一种颜色,对吗?在这个字段中,如果需要,我还需要能够在同一个框中选择多种颜色(这可以使用鼠标,但我当然希望使用脚本来完成)。
    • 嗨@Yesterdec — 感谢您的澄清!我知道您现在要做什么,从多选字段中选择多个选项。我刚刚更新了我的答案(请参阅上面“已编辑”标题下的新解决方案)。在我更新的解决方案中,我考虑了可能有多个答案的字段类型,例如复选框列表和多选字段。这些字段将支持一个所需值的单行文本或一组值以选择多个选项。请让我知道这是否适合您,如果您对我的解决方案有任何其他问题。
    • 我还添加了 cmets 以更好地了解我的 JS 代码在每个步骤中的作用,但您可能会在生产使用中删除大部分内容
    • 非常感谢 Brandon 的更新解决方案。请忍受我这些问题;-)。 fieldValues 是可从下拉列表中选择的所有选项,还是我想从下拉列表中选择的值?还是他们是别的东西?我怎样才能找到fieldNames?在控制台中查看源代码或检查时,我似乎找不到那些。为什么要包含三个单独的 sn-ps 代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多