I think that the main issue for an algorithm for large p (say cryptographic size) is the efficient test that a given number is a primitive root or not. Given that, just choosing random numbers to test or, say, small primes 2,3,5,... should work pretty well, as others have said, because the proportion EulerPhi(p-1)/(p-1) of primitive roots in the numbers prime to p is usually not too low.
If you can factorise p-1, then there is no problem on a modern computer with a decent big number arithmetic or computational algebra software package [i.e. testing n : check that n^[(p-1)/q] is not 1 mod p for each prime divisor q of p-1].
I'm certainly no expert on this problem, but I'd guess that there is probably not a known algorithm for the primitive root test if p-1 cannot be factored fully. Of course, if you factor out all the small primes of p-1 and apply the above test just for those, you will get a test with a high probability of giving the right result [if n fails the test, its not a primitive root. If it passes, its a primitive root with probablity (1-(1/q1))x..x(1-(1/qn)) where the qi are the large undiscovered prime factors of p-1].
There are a number of computer algebra packages that have factorisation routines that will factor p-1 quite often (though not with 100% guarantee) for p of crypto size (several hundred bits in binary) into pseudo primes and also have primality-proving routines if you really want to guarantee that the strong pseudo-primes in the factorisation are primes.