Я запускаю свои тесты параллельно. Много раз у меня возникали проблемы с выбором значений из выпадающего списка реакций. Предположим, мне нужно было выбрать значение из выпадающего списка, мне нужно было выполнить 2 операции: 1. Нажмите на выпадающую кнопку. 2. Выберите значение из выпадающего списка.
Иногда во время параллельного выполнения после выполнения первого шага запускается следующий поток, поэтому окно переключается. Когда он переключается обратно в первое окно и выполняет второй шаг, раскрывающийся список больше не присутствовал, поэтому тестовый набор не пройден.
Раскрывающийся список выглядит следующим образом:
Есть ли в любом случае я заставлю другие потоки ждать некоторое время, пока этот поток не выполнит действие?
Что я пробовал? Попробуйте 1: Во многих местах они сказали, что мы не можем приостановить поток из другого потока. Но все же я попробовал с этим. Кажется, что все потоки TestNG имеют имя, содержащее «TestNG», поэтому я использовал его для его идентификации. Затем добавили еще одно условие: если идентификатор этого потока не совпадает с идентификатором моего потока, я могу заставить его ждать.
public void stopThisThread(long threadId) throws Throwable{
synchronized(this) {
System.out.println("Stop other threads called...");
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
try {
for(Thread t : threadSet) {
System.out.println("Inside loop : " + printThread(t));
if(t.getName().contains("TestNG") && t.getId()!=threadId) {
t.wait();
System.out.println("Wait is called on " + t.getId());
}
}
}catch(Throwable t) {
t.printStackTrace();
}
}
}
Как и ожидалось, он не работал. Это бросило java.lang.IllegalMonitorStateException
Попробуйте 2 Я подумал, вместо того, чтобы вызывать wait из другого потока, почему бы нам не вызвать wait из того же потока, а затем позволить ему возобновить работу. Итак, здесь test2 выберет значение из выпадающего списка. Итак, я заставил поток test1 ждать. После того, как test2 завершил работу, я подумал вызвать notify, чтобы test1 возобновил свою работу. Это также не сработало.
@Test
public synchronized void test1() throws Throwable {
System.out.println("test1 - " + printThread(Thread.currentThread()));
int i = 0;
while(true) {
System.out.println("test1");
if(i == 0)
Thread.currentThread().wait();
Thread.sleep(2000);
}
}
@Test
public synchronized void test2() throws Exception{
System.out.println("test2 - " + printThread(Thread.currentThread()));
int i = 0;
while(true) {
System.out.println("test2");
Thread.sleep(2000);
if(++i == 5)
Thread.currentThread().notifyAll();
}
}
Это выдает java.lang.IllegalMonitorStateException
в обоих тестовых случаях.
Может кто-нибудь помочь мне в этом?