Racing Point, which set the pace on Friday, ended up fourth with Lance Stroll, while Alex Albon's disrupted build-up to the first Silverstone race of the season continued as he missed much of FP3 while Red Bull investigated a suspected electric issue on his RB16.
As predicted, the temperatures at Silverstone were much cooler than the 37-degree heat in which FP2 took place, with the 60-minute session on Saturday morning taking place under overcast skies at 20-degrees with the wind buffeting the cars significantly.
Ferrari's Sebastian Vettel – who missed nearly all of FP1 with an engine intercooler problem and then a chunk of FP2 as the team changed his pedals – Alfa Romeo driver Kimi Raikkonen and Carlos Sainz rotated the top spot during the early running.
Just before 20 minutes had passed, the Mercedes cars emerged on soft tyres and immediately swept to the head of the times.
Bottas bettered Sainz's 1m28.261s benchmark on the mediums by 1.1s before Hamilton then stole ahead with a 1m26.825s on his first flying lap.
They exchanged the top spot throughout the next 15 minutes, with Hamilton leading the way on a 1m26.332s approaching the final 20 minutes.
But on his final qualifying simulation run, Hamilton had a big oversteer moment as he ran through Becketts, one of the places where the wind seemed to causing particular problems, and he backed off afterwards – despite going quickest of anyone at that stage in the opening sector.
Behind him, Bottas swept the border to take the top spot with a 1m25.873s, lighting up the timing screens in all three sectors to move 0.4s clear of his teammate.
After Verstappen, who did not join the fray until 20 minutes had passed, briefly jumped up to second, Hamilton improved his best time to a 1m26011, but wound up 0.138s adrift.
Verstappen was one of the runners – including Bottas – to have a wide moment at Village late on, another place where the wind made things tricky for the drivers, and he finished 0.3s slower than Bottas's best.
Stroll jumped up to fourth with a late run to beat Sainz to best of the rest, with Charles Leclerc taking sixth as the lead Ferrari.
Several times Leclerc set the best time in the first sector, before fading through the rest of the lap compared to the Mercedes drivers.
Lando Norris took sixth for McLaren, with Daniel Ricciardo, finishing seventh for Renault and finishing the session with the quickest time in the first sector.
Nico Hulkenberg's build-up to his F1 return continued as he took ninth for Racing Point, with the German driver finishing 0.2s slower than new teammate Stroll and at one point complaining about the "knobs inside the headrest" on his RP20.
Pierre Gasly rounded out the top 10 ahead of his AlphaTauri teammate Daniil Kvyat.
Albon, who missed the second half of FP2 after his crash at Stowe on Friday afternoon, did not get to drive until just over 45 minutes had passed in the session, and he then had his first timed lap deleted for exceeding track limits at Copse.
He eventually posted a 1m27.178s that put him P13 in the standings.
That was one spot ahead of Vettel, who had an off-track moment following a big lock up at Village early on and then a similar snap of oversteer to Hamilton at Becketts as he went for his first flying lap on softs.
But Vettel had to pit again approaching the final 10 minutes as he reported another problem with something again "loose" with his brake pedal.