Перейти к содержимому

Фотография

как избежать Thread sleep

WebDriverWAit

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 Bersikan

Bersikan

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Khozeyev Anton


Отправлено 08 апреля 2015 - 09:34

помогите пожалуйста с ожидаем загрузки определенного объекта.

например, есть такой код

 

package ta.maxcare.test;

import static org.junit.Assert.fail;

import java.util.Date;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;

import com.thoughtworks.selenium.Wait;
//import org.openqa.selenium.support.ui.Select;

public class AddRi extends BaseTest {
  private WebDriver driver;

  private String baseUrl;

  private long timeout = 15000;

  private StringBuffer verificationErrors = new StringBuffer();

  @Before
  public void setUp() throws Exception {
    driver = new InternetExplorerDriver();
    baseUrl = "https://10.1.184.92:13107";
    driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
  }
 
 
 
  @Test
  public void test1() throws Exception {
    login(driver, baseUrl);
    driver.switchTo().frame(find(driver, By.name("Content"), timeout));
    WebElement sapIdFromFilter = find(driver, By.name("filter:sapIdFrom"), timeout);
    sapIdFromFilter.clear();
    sapIdFromFilter.sendKeys("200000552068");
    find(driver, By.name("filter:P_AccSearchButtonDFID"), timeout).click();
    find(driver, By.xpath("//table[@class='dataview']/tbody/tr/td[2]/span/a"), timeout).click();
    openTreeAttribute(driver, "Invoice");
    String windowHandle = driver.getWindowHandle();
    Thread.sleep(2000);
    driver.switchTo().frame("Content");
    Thread.sleep(2000);
    driver.findElement(By.name("Add_RI_Invoice")).click();

 

Как заменить ThredSleep на что то вроде
Wait.untill(driver.findElement(By.name("Add_RI_Invoice")))

Погите пожалйста с методом конкретно на моем примере

 

Не судите строго, ибо я только начал учить джаву и пытаться использовать вебдрайвер


  • 0

#2 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 08 апреля 2015 - 10:16

http://selenium2.ru/...waits-reference

Часть Неявные ожидания


  • 0

#3 Bersikan

Bersikan

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Khozeyev Anton


Отправлено 08 апреля 2015 - 12:47

http://selenium2.ru/...waits-reference

Часть Неявные ожидания

package ta.maxcare.test;

import static org.junit.Assert.fail;

import java.util.Date;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class AddRi extends BaseTest {
  private WebDriver driver;

  private String baseUrl;

  private long timeout = 15000;

  private StringBuffer verificationErrors = new StringBuffer();

  @Before
  public void setUp() throws Exception {
    driver = new InternetExplorerDriver();
    baseUrl = "https://10.1.184.92:13107";
    driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
  }
 
 
 
  @Test
  public void test1() throws Exception {
    login(driver, baseUrl);
    driver.switchTo().frame(find(driver, By.name("Content"), timeout));
    WebElement sapIdFromFilter = find(driver, By.name("filter:sapIdFrom"), timeout);
    sapIdFromFilter.clear();
    sapIdFromFilter.sendKeys("200000552068");
    find(driver, By.name("filter:P_AccSearchButtonDFID"), timeout).click();
    find(driver, By.xpath("//table[@class='dataview']/tbody/tr/td[2]/span/a"), timeout).click();
    openTreeAttribute(driver, "Invoice");
    String windowHandle = driver.getWindowHandle();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("Content")));
    driver.switchTo().frame("Content");
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("Add_RI_Invoice")));
    driver.findElement(By.name("Add_RI_Invoice")).click();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("Content")));
    driver.switchTo().frame("Content");
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("P_TA_AdjustmentRiInvoiceDFID")));
    driver.findElement(By.name("P_TA_AdjustmentRiInvoiceDFID")).click();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("adjustment.common.amount")));
    driver.findElement(By.name("adjustment.common.amount")).clear();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("adjustment.common.amount")));
    driver.findElement(By.name("adjustment.common.amount")).sendKeys("150");
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("adjustment.remark")));
    driver.findElement(By.name("adjustment.remark")).sendKeys("Adjustmend added by selenium");
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("itemID")));
    driver.findElement(By.name("itemID")).sendKeys("74674");
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("P_ItemSearchDFID")));
    driver.findElement(By.name("P_ItemSearchDFID")).click();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("P_OkDFID")));
    driver.findElement(By.name("P_OkDFID")).click();
    Thread.sleep(2000);
    driver.switchTo().window(windowHandle);
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable((By.name("tabs:panel:commonFrameRow:commonPanel:invoice:requestBtn"))));
    driver.findElement(By.name("tabs:panel:commonFrameRow:commonPanel:invoice:requestBtn")).click();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable((By.xpath("//div[@class='w_content']/iframe"))));
    WebElement confAction = driver.findElement(By.xpath("//div[@class='w_content']/iframe"));
    driver.switchTo().frame(confAction);
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("buttonOK")));
    driver.findElement(By.name("buttonOK")).click();
    Thread.sleep(2000);
    driver.switchTo().window(windowHandle);
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='w_content']/iframe")));
    WebElement csrNoteFrame = driver.findElement(By.xpath("//div[@class='w_content']/iframe"));
    driver.switchTo().frame(csrNoteFrame);
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("csrNoteText")));
    //setTextIntoField(driver.findElement(By.name("csrNoteText")), (new Date()).toString());
    driver.findElement(By.name("csrNoteText")).sendKeys((new Date()).toString());
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.name("closeOK")));
    driver.findElement(By.name("closeOK")).click();
    Thread.sleep(2000);
    driver.switchTo().window(windowHandle);
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='navPanel']")));
    WebElement navPanel = driver.findElement(By.xpath("//span[@class='navPanel']"));
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='navPanel']")));
    navPanel.click();
    (new WebDriverWait(driver, 1000)).until(ExpectedConditions.elementToBeClickable(By.cssSelector("img[title=\"Close\"]")));
    logout(driver);
    
  }

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }

}

 

 

получилось как то так, но не получается с
Thread.sleep(2000);
    driver.switchTo().window(windowHandle);

 

тут тред слип приходится оставлять, его можно как то обойти в этом моменте?


  • 0

#4 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 08 апреля 2015 - 13:07

Я так понимаю, это ожидание открытия нового окна.

Вы кликаете по кнопке, у вас открывается новое окно и вы переключаетесь на окно откуда вы нажимали на кнопку.

Но вы ничего не делаете в том окне что открылось, почему? - по хорошему, его бы закрыть тогда.

Для начала этого достаточно, т.к. по идее, вам открывшееся окно не важно, важно будет когда вы в нём буде-те что-то делать, т.к. оно может не появится за те 2 секунды.

Тогда надо будет писать своё ожидание, что-то типа того: ждать пока у драйвера не появится 2 windowHandle.

Используйте возможности оформления кода в ваших сообщениях, пожалуйста.

  • 0

#5 Bersikan

Bersikan

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Khozeyev Anton


Отправлено 08 апреля 2015 - 13:08

 

Я так понимаю, это ожидание открытия нового окна.

Вы кликаете по кнопке, у вас открывается новое окно и вы переключаетесь на окно откуда вы нажимали на кнопку.

Но вы ничего не делаете в том окне что открылось, почему? - по хорошему, его бы закрыть тогда.

Для начала этого достаточно, т.к. по идее, вам открывшееся окно не важно, важно будет когда вы в нём буде-те что-то делать, т.к. оно может не появится за те 2 секунды.

Тогда надо будет писать своё ожидание, что-то типа того: ждать пока у драйвера не появится 2 windowHandle.

Используйте возможности оформления кода в ваших сообщениях, пожалуйста.

Это окно важно, там не то что именно новое кно открыть надо, а как бы внутренний фрейм, но ищет оно его только как window


  • 0

#6 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 08 апреля 2015 - 13:39

Я не вижу чем оно для вас важно, что вы в нём делаете?

там где вы делаете driver.switchTo().window(windowHandle); - это переключение на первоначальное окно, после нажатия на кнопку, но вы ничего не сделали в том окне/фрейме что открылось.


  • 0

#7 Bersikan

Bersikan

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Khozeyev Anton


Отправлено 08 апреля 2015 - 14:40

Я не вижу чем оно для вас важно, что вы в нём делаете?

там где вы делаете driver.switchTo().window(windowHandle); - это переключение на первоначальное окно, после нажатия на кнопку, но вы ничего не сделали в том окне/фрейме что открылось.

получается мы как бы возращаемся в преидущее окно.
к примеру, что что сделали, потом вылетел фрейм на подтверждение дейсятвия

мы его подтверждаем переключившись на этот фрейм
driver.switchTo().frame("Content");

на этом фрейме жмем ОК - он закрывается

что бы дальше продолжить работу, надо вернуться на пердыидущий фрейм, который получается вызвать только с помощью

driver.switchTo().window(windowHandle)

на котором дальше и работаем

 

 


  • 0

#8 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 08 апреля 2015 - 14:50

Ладно, тогда лучше всё-таки заменить слип на ожидание в цикле того чтобы windowHandles стало больше на 1 (т.е. окон стало больше).



int num = driver.getWindowHandles().size();

//тут кликаем куда надо

//ждём открытия
while(driver.getWindowHandles().size()<=num){
sleep(200);
}

  • 0

#9 Bersikan

Bersikan

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Khozeyev Anton


Отправлено 08 апреля 2015 - 15:20

 

Ладно, тогда лучше всё-таки заменить слип на ожидание в цикле того чтобы windowHandles стало больше на 1 (т.е. окон стало больше).



int num = driver.getWindowHandles().size();

//тут кликаем куда надо

//ждём открытия
while(driver.getWindowHandles().size()<=num){
sleep(200);
}

спасибо, буду пробовать


  • 0

#10 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 08 апреля 2015 - 16:13

 

Ладно, тогда лучше всё-таки заменить слип на ожидание в цикле того чтобы windowHandles стало больше на 1 (т.е. окон стало больше).



int num = driver.getWindowHandles().size();

//тут кликаем куда надо

//ждём открытия
while(driver.getWindowHandles().size()<=num){
sleep(200);
}

А если не будет доп. окна ? хочешь бесконечный цикл поставить :)


  • 0

#11 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 09 апреля 2015 - 07:40

Не бесите меня, всё, решили поставить слип на 5 секунд, чтоб не усложнять))))

Всё разжёвывать - это не хорошо, пусть учатся на своих ошибках, но да, забыл про то что может и не появиться...


  • 0



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных