Python和Selenium使用隐藏字段以动态形式填充

Python和Selenium使用隐藏字段以动态形式填充,python,selenium,ui-automation,Python,Selenium,Ui Automation,我正在尝试通过航空公司网站自动运行。它需要登录,这是我在Python中使用Selenium实现的 但是,要填写的表格有两个问题。 1.使用Selenium选择出发城市失败,因为该字段已隐藏。通过使用javascript将其设置为可见,我已经解决了这个问题。 2.选择出发城市后,“目的地城市”字段仅填充选项。使用Selenium,网站似乎不接受出发城市已被选中,因此该列表从未填充 这是网站上的代码: <div class="input depart-city

我正在尝试通过航空公司网站自动运行。它需要登录,这是我在Python中使用Selenium实现的

但是,要填写的表格有两个问题。 1.使用Selenium选择出发城市失败,因为该字段已隐藏。通过使用javascript将其设置为可见,我已经解决了这个问题。 2.选择出发城市后,“目的地城市”字段仅填充选项。使用Selenium,网站似乎不接受出发城市已被选中,因此该列表从未填充

这是网站上的代码:

                <div class="input depart-city select combobox no-regions">
                <label for="departCity" class="visuallyhidden">Departure City </label>
                <select name="departCity" id="departCity" title="Departure City" style="display: none;">
    <option value="">Departure City</option>
    <option value="FRA">Frankfurt</option>
    <option value="MUC">Munich</option>
</select>
<input placeholder="Departure City" title="Departure City" autocomplete="off" class="ui-autocomplete-input ui-widget ui-widget-content" role="textbox" aria-autocomplete="list" aria-haspopup="true"><button type="button" class="ui-button icon-arrow-down ui-button-icon" tabindex="-1" title="Show All Items"> </button>

            <ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all" role="listbox" aria-activedescendant="ui-active-menuitem" style="z-index: 1; top: 0px; left: 0px; display: none;"></ul></div>

            <div class="input destination-city select combobox" id="destinationLinkSelect">
                <label for="destCity" class="visuallyhidden">Destination City </label>


                    <select name="destCity" id="destCity" title="Destination City " style="display: none;">
                        <option value="">Destination City </option>
                    </select><input placeholder="Destination City " title="Destination City " autocomplete="off" class="ui-autocomplete-input ui-widget ui-widget-content" role="textbox" aria-autocomplete="list" aria-haspopup="true"><button type="button" class="ui-button icon-arrow-down ui-button-icon" tabindex="-1" title="Show All Items"> </button>

            <ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all" role="listbox" aria-activedescendant="ui-active-menuitem" style="z-index: 1; top: 0px; left: 0px; display: none;"></ul></div>

有什么想法吗?我认为Aria haspopup导致了我的问题,但我不确定。

您可以使用以下代码来避免应用
JavaScript
,并模拟真实的用户行为:

# Click arrow-button to open drop-down
driver.find_element_by_xpath('//button[@title="Show All Items"]').click()
# Select required option
driver.find_element_by_link_text('Frankfurt').click()
同样,您可以处理“目的地”字段:


您可以使用以下代码来避免应用
JavaScript
,并模拟真实的用户行为:

# Click arrow-button to open drop-down
driver.find_element_by_xpath('//button[@title="Show All Items"]').click()
# Select required option
driver.find_element_by_link_text('Frankfurt').click()
同样,您可以处理“目的地”字段:


我用@Andersson的答案成功地解决了这个问题。但是,该站点无法从列表中进行选择或在组合框中键入内容。它需要箭头来选择选项,就像鼠标点击它一样

我在该部分的代码如下:

    driver.find_element_by_id("voyagerFlightSearch").send_keys(Keys.TAB)
    driver.find_element_by_xpath('//button[@title="Show All Items"]').click()
    driver.find_element_by_class_name('ui-widget').send_keys(Keys.ARROW_DOWN + Keys.ARROW_DOWN + Keys.ARROW_DOWN + Keys.TAB)
    time.sleep(1)
    driver.find_element_by_xpath('(//button[@title="Show All Items"])[2]').click()
    driver.find_elements_by_class_name('ui-widget')[2].send_keys("Johannesburg (OR Tambo)" + Keys.TAB)

我用@Andersson的答案成功地解决了这个问题。但是,该站点无法从列表中进行选择或在组合框中键入内容。它需要箭头来选择选项,就像鼠标点击它一样

我在该部分的代码如下:

    driver.find_element_by_id("voyagerFlightSearch").send_keys(Keys.TAB)
    driver.find_element_by_xpath('//button[@title="Show All Items"]').click()
    driver.find_element_by_class_name('ui-widget').send_keys(Keys.ARROW_DOWN + Keys.ARROW_DOWN + Keys.ARROW_DOWN + Keys.TAB)
    time.sleep(1)
    driver.find_element_by_xpath('(//button[@title="Show All Items"])[2]').click()
    driver.find_elements_by_class_name('ui-widget')[2].send_keys("Johannesburg (OR Tambo)" + Keys.TAB)

谢谢,这正确地选择了列表,但它似乎没有点击法兰克福选项。它高亮显示它,但不单击它。所以第二个列表没有被填充。谢谢,这正确地选择了列表,但是它似乎没有点击法兰克福选项。它高亮显示它,但不单击它。如果GUI测试是基于与隐藏元素的直接交互,那么你就没有做真正用户在页面上会做的事情。这一事实使得测试毫无意义。通过做真正的用户也能做的事情来实现你想要的。我同意,这似乎就是这个网站的设计方式。除非你点击它,否则它是隐藏的。然后点击它来隐藏它。;-)祝你好运如果GUI测试是基于与隐藏元素的直接交互,那么您并不是在做真正用户在页面上会做的事情。这一事实使得测试毫无意义。通过做真正的用户也能做的事情来实现你想要的。我同意,这似乎就是这个网站的设计方式。除非你点击它,否则它是隐藏的。然后点击它来隐藏它。;-)祝你好运