如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?

Posted

技术标签:

【中文标题】如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?【英文标题】:How to open the option items of a select tag (dropdown) in different tabs/windows? 【发布时间】:2019-01-14 07:41:48 【问题描述】:

我正在尝试使用 Python 和 Selenium 抓取该网站,它要求您从下拉框中选择一个日期,然后单击搜索以查看规划应用程序。

网址:https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList。

我的代码可以选择下拉框的第一个索引并按搜索。如何为下拉框中的所有日期选项打开多个窗口,或者一个一个地浏览它们以便我可以抓取它?

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options


options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome('/Users/weaabduljamac/Downloads/chromedriver', 
chrome_options=options)

url = 'https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList'
driver.get(url)

select = Select(driver.find_element_by_xpath('//*[@id="selWeek"]'))
select.select_by_index(1)

button = driver.find_element_by_id('csbtnSearch')
button.click()

app_numbers = driver.find_element_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a').text
print(app_numbers)

下拉框 html

<select class="formitem" id="selWeek" name="selWeek">
   <option selected="selected" value="2018,31">Week commencing Monday 30 July 2018</option>
   <option value="2018,30">Week commencing Monday 23 July 2018</option>
   <option value="2018,29">Week commencing Monday 16 July 2018</option>
   <option value="2018,28">Week commencing Monday 9 July 2018</option>
   <option value="2018,27">Week commencing Monday 2 July 2018</option>
   <option value="2018,26">Week commencing Monday 25 June 2018</option>
   <option value="2018,25">Week commencing Monday 18 June 2018</option>
   <option value="2018,24">Week commencing Monday 11 June 2018</option>
   <option value="2018,23">Week commencing Monday 4 June 2018</option>
   <option value="2018,22">Week commencing Monday 28 May 2018</option>
</select>

【问题讨论】:

我猜你需要使用 switch_to_window 寻找这个帖子:***.com/questions/17325629/… 您所要求的可以在 WATIR 中轻松完成(位于 Ruby Selenium Binding 的顶部)。如果你准备好考虑 Ruby,我可以帮助你。 【参考方案1】:

根据您的问题,您将无法为不同的下拉选项打开多个窗口,因为 &lt;options&gt; 标记不包含任何 href 属性。它们将始终在同一浏览器窗口中呈现新页面。

然而,从下拉列表中选择一个日期,然后click()搜索来查看您可以使用以下解决方案的计划申请:

代码块:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
url = 'https://services.wiltshire.gov.uk/PlanningGIS/LLPG/WeeklyList'
driver.get(url)

select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
list_options = select.options
for item in range(len(list_options)):
    select = Select(driver.find_element_by_xpath("//select[@class='formitem' and @id='selWeek']"))
    select.select_by_index(str(item))
    driver.find_element_by_css_selector("input.formbutton#csbtnSearch").click()
    print(driver.find_element_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a').text)
    driver.get(url)
driver.quit()

控制台输出:

18/06760/FUL
18/07187/LBC
18/06843/FUL
18/06705/FUL
18/06449/FUL
18/05534/FUL
18/06030/DEM
18/05784/FUL
18/05914/LBC
18/05241/FUL

琐事

要抓取所有需要替换的链接:

find_element_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a')

与:

find_elements_by_xpath('//*[@id="form1"]/table/tbody/tr[1]/td[1]/a')

【讨论】:

您好,感谢您的回复,这正是我想要的。我可以在去下一个日期之前刮掉每一页上的所有申请号吗? 因为理想情况下我想在每个页面上抓取申请号、地址、提案、状态,然后将其写入 json 文件 @AbdulJamac like to scrape application number, address , proposal , status on each pagefor all the date options in the drop-down box or go through them one by one 不一样吗?请针对您的新要求提出一个新问题。 *** 志愿者将很乐意为您提供帮助。 好的,我已经完成了,谢谢你的帮助,我真的很感激【参考方案2】:

我很确定这是不可能的,您必须遍历选项并将数据存储在某处,然后从每个下拉列表中附加新数据。

希望这会有所帮助。

【讨论】:

【参考方案3】:

您可以在搜索按钮上执行click + ctrl在新窗口中打开链接,抓取数据,然后返回第一页选择下一个选项

# original window to switch back
window_before = driver.window_handles[0]

select = Select(driver.find_element_by_id('selWeek'))
options = select.options
for option in options :
    select.select_by_visible_text(option.text)

    # click to open link in new window
    button = driver.find_element_by_id('csbtnSearch')
    ActionChains(driver).key_down(Keys.CONTROL).click(button).key_up(Keys.CONTROL).perform()

    # switch to new window and scrap the data
    driver.switch_to_window(driver.window_handles[1])

    # scrap the data

    # return to original window
    driver.close()
    driver.switch_to_window(window_before)

【讨论】:

是否有任何导入我得到了错误:1.'Select'的实例没有'select_by_deselect_by_visible_text'成员2.未定义的变量'ActionChains'成员3.未定义的变量'Keys' 4.未定义的变量' window_handles' @AndreiSuvorkov 在他尝试之前我们不会知道,不是吗? 我仍然得到错误:'未定义的变量'window_handles'' @AbdulJamac select.select_by_visible_text(一个select.)和driver.window_handles[1](添加driver. 是的,谢谢你,现在我运行它时删除了所有代码错误,我得到 driver.switch_to_window(driver.window_handles[1]) IndexError: list index out of range

以上是关于如何在不同的选项卡/窗口中打开选择标签(下拉菜单)的选项?的主要内容,如果未能解决你的问题,请参考以下文章

VC中怎么滚动条宽度怎么解决

1.1 Illustrator选项卡标签的使用

按下选项卡时如何在焦点上打开 select2 下拉菜单

如何操作页面多个窗口?

如何使下拉菜单宽度与选项卡大小相同?

MFC中如何做出一个下拉菜单并且做出不同的选项?