【问题标题】:How to set day value; using Selenum-Chrome-Webdriver in Excel-VBA如何设置日期值;在 Excel-VBA 中使用 Selenium-Chrome-Webdriver
【发布时间】:2019-10-24 22:28:27
【问题描述】:

我正在尝试利用 Selenium 来自动化标准化的网络输入;但是,剩下的部分是处理日历弹出窗口。我需要将日历的值动态设置为工作表中的相对单元格值。

我正在使用我的 Windows 计算机 - Excel-VBA;使用 Selenium Webdriver 和 Chromedriver。我尝试过同时使用 Xpaths-Method、ExecuteScript (JS) 和控制鼠标。

Sub googStart()

Dim bot As New WebDriver
Dim rng As Range
Dim ele As WebElement

' 
lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row


bot.Start "chrome", "URL HERE"
bot.Get "/"

For X = 2 To lastRow
   Set ele = bot.FindElementById("calendarId").AsSelect
   ele.SelectByValue "30"
' Above threw an runt time error 59

bot.FindElementById("calendarId").Click
' this opens up the calender's pop up 

bot.Wait 500

Also, tRied the below combinations: 


' cScript = "document.getElementsByClass('a-cal-days').value='29'"

' bot.ExecuteScript cScript


' For Each ele In bot.FindElementsByXPath("//select[@class='a-cal-select-day[]']")

' ele.AsSelect = Sheet1.Cells(X, 4)

' bot.FindElementById("calendarInputId").Value ("10/29/2019")

' bot.FindElementByXPath("(//[@class='a-cal-d'])").Text Sheet1.Cells(X, 5)

' bot.findElement(By.xpath("//input[@id='calendarId']/div[1]/select[2])).setAttribute('value', '24')

' //*[@id="calendarId"]/div[1]/select[1] ' Month

' //*[@id='calendarId']/div[1]/select[2] ' day select

' //*[@id="calendarId"]/div[1]/select[2]

单元格值;需要匹配日历日期和月份:见附图! 以下是 HTML:

<td>
  <div id="calendarId" data-a-cal-attributes="{&quot;minDate&quot;:{&quot;month&quot;:10,&quot;year&quot;:2019,&quot;day&quot;:23},&quot;maxDate&quot;:{&quot;month&quot;:10,&quot;year&quot;:2020,&quot;day&quot;:24},&quot;selectedDate&quot;:{&quot;month&quot;:10,&quot;year&quot;:2019,&quot;day&quot;:24}}"
    data-a-cal-input="true" class="a-cal-calendar-container a-cal-static">
    <div class="a-cal-dropdown-container">
      <select data-action="a-cal-dropdown-select" class="a-cal-select-month a-declarative">
        <option value="">Month</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
      </select>
      <select data-action="a-cal-dropdown-select" class="a-cal-select-day a-declarative">
        <option value="">Day</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
        <option value="13">13</option>
        <option value="14">14</option>
        <option value="15">15</option>
        <option value="16">16</option>
        <option value="17">17</option>
        <option value="18">18</option>
        <option value="19">19</option>
        <option value="20">20</option>
        <option value="21">21</option>
        <option value="22">22</option>
        <option value="23">23</option>
        <option value="24">24</option>
        <option value="25">25</option>
        <option value="26">26</option>
        <option value="27">27</option>
        <option value="28">28</option>
        <option value="29">29</option>
        <option value="30">30</option>
        <option value="31">31</option>
      </select>
      <select data-action="a-cal-dropdown-select" class="a-cal-select-year a-declarative">
        <option value="">Year</option>
        <option value="1900">1900</option>
        <option value="1901">1901</option>
        <option value="1902">1902</option>
        <option value="1903">1903</option>
        <option value="1904">1904</option>
        <option value="1905">1905</option>
        <option value="1906">1906</option>
        <option value="1907">1907</option>
        <option value="1908">1908</option>
        <option value="1909">1909</option>
        <option value="1910">1910</option>
        <option value="1911">1911</option>
        <option value="1912">1912</option>
        <option value="1913">1913</option>
        <option value="1914">1914</option>
        <option value="1915">1915</option>
        <option value="1916">1916</option>
        <option value="1917">1917</option>
        <option value="1918">1918</option>
        <option value="1919">1919</option>
        <option value="1920">1920</option>
        <option value="1921">1921</option>
        <option value="1922">1922</option>
        <option value="1923">1923</option>
        <option value="1924">1924</option>
        <option value="1925">1925</option>
        <option value="1926">1926</option>
        <option value="1927">1927</option>
        <option value="1928">1928</option>
        <option value="1929">1929</option>
        <option value="1930">1930</option>
        <option value="1931">1931</option>
        <option value="1932">1932</option>
        <option value="1933">1933</option>
        <option value="1934">1934</option>
        <option value="1935">1935</option>
        <option value="1936">1936</option>
        <option value="1937">1937</option>
        <option value="1938">1938</option>
        <option value="1939">1939</option>
        <option value="1940">1940</option>
        <option value="1941">1941</option>
        <option value="1942">1942</option>
        <option value="1943">1943</option>
        <option value="1944">1944</option>
        <option value="1945">1945</option>
        <option value="1946">1946</option>
        <option value="1947">1947</option>
        <option value="1948">1948</option>
        <option value="1949">1949</option>
        <option value="1950">1950</option>
        <option value="1951">1951</option>
        <option value="1952">1952</option>
        <option value="1953">1953</option>
        <option value="1954">1954</option>
        <option value="1955">1955</option>
        <option value="1956">1956</option>
        <option value="1957">1957</option>
        <option value="1958">1958</option>
        <option value="1959">1959</option>
        <option value="1960">1960</option>
        <option value="1961">1961</option>
        <option value="1962">1962</option>
        <option value="1963">1963</option>
        <option value="1964">1964</option>
        <option value="1965">1965</option>
        <option value="1966">1966</option>
        <option value="1967">1967</option>
        <option value="1968">1968</option>
        <option value="1969">1969</option>
        <option value="1970">1970</option>
        <option value="1971">1971</option>
        <option value="1972">1972</option>
        <option value="1973">1973</option>
        <option value="1974">1974</option>
        <option value="1975">1975</option>
        <option value="1976">1976</option>
        <option value="1977">1977</option>
        <option value="1978">1978</option>
        <option value="1979">1979</option>
        <option value="1980">1980</option>
        <option value="1981">1981</option>
        <option value="1982">1982</option>
        <option value="1983">1983</option>
        <option value="1984">1984</option>
        <option value="1985">1985</option>
        <option value="1986">1986</option>
        <option value="1987">1987</option>
        <option value="1988">1988</option>
        <option value="1989">1989</option>
        <option value="1990">1990</option>
        <option value="1991">1991</option>
        <option value="1992">1992</option>
        <option value="1993">1993</option>
        <option value="1994">1994</option>
        <option value="1995">1995</option>
        <option value="1996">1996</option>
        <option value="1997">1997</option>
        <option value="1998">1998</option>
        <option value="1999">1999</option>
        <option value="2000">2000</option>
        <option value="2001">2001</option>
        <option value="2002">2002</option>
        <option value="2003">2003</option>
        <option value="2004">2004</option>
        <option value="2005">2005</option>
        <option value="2006">2006</option>
        <option value="2007">2007</option>
        <option value="2008">2008</option>
        <option value="2009">2009</option>
        <option value="2010">2010</option>
        <option value="2011">2011</option>
        <option value="2012">2012</option>
        <option value="2013">2013</option>
        <option value="2014">2014</option>
        <option value="2015">2015</option>
        <option value="2016">2016</option>
        <option value="2017">2017</option>
        <option value="2018">2018</option>
        <option value="2019">2019</option>
        <option value="2020">2020</option>
        <option value="2021">2021</option>
        <option value="2022">2022</option>
        <option value="2023">2023</option>
        <option value="2024">2024</option>
        <option value="2025">2025</option>
        <option value="2026">2026</option>
        <option value="2027">2027</option>
        <option value="2028">2028</option>
        <option value="2029">2029</option>
        <option value="2030">2030</option>
        <option value="2031">2031</option>
        <option value="2032">2032</option>
        <option value="2033">2033</option>
        <option value="2034">2034</option>
        <option value="2035">2035</option>
        <option value="2036">2036</option>
        <option value="2037">2037</option>
        <option value="2038">2038</option>
        <option value="2039">2039</option>
      </select>
    </div>
    <div class="a-cal-date-range-group a-cal-date-range-group-vertical">
      <div class="a-cal-date-range-wrapper">
        <div class="a-input-text-addon-group-wrapper">
          <div class="a-input-text-addon-group a-width-medium"><span class="a-input-text-addon"><i class="a-icon a-icon-calendar"></i></span><input type="text" maxlength="10" data-action="a-cal-input" data-input="start" class="a-input-text a-cal-input a-declarative" id="calendarInputId" /></div>
        </div>
      </div>
    </div>
  </div>
</td>

【问题讨论】:

    标签: excel vba selenium-webdriver xpath selenium-chromedriver


    【解决方案1】:

    您需要确保它是作为基础的select 元素。另外,我认为您不能抓住弹出窗口的窗口句柄并使用它来切换到弹出窗口,但您可以尝试bot.SwitchToNextWindow。你用bot.SwitchToDefaultContent返回原始状态。

    例如

    bot.SwitchToNextWindow
    
    Dim monthSel As Object, daySel As Object
    
    Set monthSel = bot.FindElementByCss(".a-cal-select-month").AsSelect
    Set daySel = bot.FindElementByCss(".a-cal-select-day").AsSelect
    Set yearSel = bot.FindElementByCss(".a-cal-select-year").AsSelect
    

    那么我希望您能够利用 SelectBy 方法,例如

                                ''<== assuming cell contains value 1
    monthSel.SelectByText "10"   'or  monthSel.SelectByText ActiveSheet.Cells(2,1).value
    
    daySel.SelectByValue "29"   
    yearSel.SelectByValue 2019   'different ways of doing same thing shown
    

    小心您当前的 lastRow 计算和循环方法。 AsSelect 可以在任何循环之外完成,因为您不需要设置新的引用(至少我不这么认为);您只想更改下拉列表中当前选择的值。

    【讨论】:

    • 谢谢;所以我尝试了以下代码:'Sub googStart() Dim bot As New WebDriver Dim rng As Range Dim ele As WebElement Dim monthSel As Object Dim daySel As Object lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp) .Row For X = 2 To lastRow
    • 'Set monthSel = bot.FindElementByCss(".a-cal-select-month").AsSelect Set daySel = bot.FindElementByCss(".a-cal-select-day").AsSelect Set yearSel = bot.FindElementByCss(".a-cal-select-year").AsSelect bot.FindElementById("calendarInputId").Click monthSel.SelectByValue "10" ' Sheet1.Cells(X, 5).Value daySel.SelectByValue " 31" 'Sheet1.Cells(X, 6).Value yearSel.SelectByValue 2019 bot.Wait 500'
    • 但是.. 它给了我一个运行时错误 '11' ElementNotVisibleError; element not intractable:元素当前不可见,可能无法操作。
    • 还应注意-滤锅框不是下拉框,而是弹出框
    • 你需要切换到那个窗口。正常方式(至少在其他语言中是stackoverflow.com/a/29052586/6241235)但如果vba没有实现gethandles,可以尝试如我的编辑中所示回答。
    猜你喜欢
    • 2020-06-14
    • 2017-09-09
    • 2022-09-23
    • 2022-01-02
    • 2021-05-15
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多