Kohli made 97 and Ajinkya Rahane contributed 81 as they shared India’s ground-record fourth-wicket stand to give the tourists a foothold at last in the series where they trail 2-0.
India reached 307 for six at stumps after Joe Root put them in.
The scene was set here for Stokes to take centre stage on his return to Test cricket, a controversial selection with some despite his affray acquittal at Bristol Crown Court on Tuesday.
Woakes took three for 75 on Saturday, having stepped into the side and impressed at Lord’s last week when Stokes was busy in Bristol.
Kohli and Rahane shut out England during the afternoon and well into the evening, before both fell short of three figures – Kohli eventually caught at slip by Stokes, aiming to hit an Adil Rashid leg-break for the boundary which would have completed his hundred.
India nonetheless held sway, debutant wicketkeeper Rishabh Pant hitting his first Test runs with a six over long-on second ball off Rashid in a handy stand with Hardik Pandya either side of the second new ball.
The tourists appeared determined from the outset to make sure England’s bowlers would have to work harder here than for their quickfire, landslide win at rainy Lord’s.
The new ball swung prodigiously under cloud cover.
The result was a partnership of 60, at that point India’s highest for any wicket in the series, only for the introduction of Woakes to spark a lunchtime wobble.
Dhawan’s was the first of three wickets to fall for 22 runs, neatly caught at second slip as he edged one on the back-foot defence.
Rahul was then unable to handle exaggerated seam movement, which pinned him lbw defending deep in his crease, before Cheteshwar Pujara hooked the last ball of the morning straight to Rashid at long leg.
Kohli stood aghast at the non-striker’s end, all the more entrenched for the second session as he and Rahane duly put together an exemplary stand.
There was barely an anxious moment as they profited especially off Stokes and also when Root turned to Rashid – who was farmed, risk-free, for almost six an over in his first spell.
The evening began with a wonderful effort by James Anderson while attempting a one-handed catch above his head at point as Rahane launched a ferocious cut at Woakes on 57.
It stopped a certain four but Anderson could not hold on, and it was only a moment of brilliance from Alastair Cook at slip that eventually broke the partnership – Rahane with the edge off Stuart Broad and England’s former captain displaying memorable reactions to hold the half-chance one-handed away to his left.
Kohli seemed sure to bag his second century of the summer, until his misadventure against Rashid.
Stat: This is just the second time that Kohli has been dismissed in the 90s in Tests.— Cricbuzz (@cricbuzz) August 18, 2018
Previous instance was 96 in the 2nd innings at the Wanderers in 2013. After that knock, 17 times he scored 100s in between when he reached 90. #ENGVIND
But India still finished on top.
Keaton Jennings put down a straightforward catch at third slip when Broad got extra bounce to hit Pandya on glove and shoulder – but the deserving Anderson had the same batsman edging the final ball of the day for Jos Buttler’s second slip catch.
Know more about Sport360 Application