Щелчок по элементу, на который нацелен идентификатор, но результат по-прежнему неверен

#java #selenium #selenium-webdriver

#java #selenium #selenium-webdriver

Вопрос:

Я тестирую Selenium-Webdriver на странице Google Translate. То, что я пытаюсь сделать, это:

  1. Посмотрите, представлен ли уже язык ввода
  2. Если он представлен, выбран ли он? Если нет, выберите его.
  3. Если нет, откройте таблицу more language. Выберите (щелкните) язык в таблице.
  4. Посмотрите, представлен ли уже язык вывода
  5. Если он представлен, выбран ли он? Если нет, выберите его.
  6. Если нет, откройте таблицу more language. Выберите (щелкните) язык в таблице.
  7. Наконец, переведите и проверьте результат

У меня нет никаких проблем со случаем 1: язык ввода и вывода уже представлен, и результат соответствует ожиданиям. Но в случае 2: язык вывода еще не представлен и должен быть выбран в таблице, возникает проблема. Выбранный язык неверен (например, я выбираю норвежский, но в конечном итоге будет выбран самоанский). Ввод select использует тот же способ выбора, но вообще не возвращает никаких проблем.

Мой код ниже

 package TestNG;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;

public class GoogleTranslate {

    WebDriver driver;

    @BeforeMethod
    public void setUp() {
        System.setProperty("webdriver.gecko.driver","F:\path\geckodriver.exe");
        driver=new FirefoxDriver();
    }

    @Test(priority=0)
    public void VietnameseToEnglish() throws InterruptedException { 


    // Go to google translate
        driver.manage().window().maximize();
        driver.get("https://translate.google.com/");
        Thread.sleep(5000);

    // Check if the page is correct
        String currentTitle = driver.getTitle();
        Assert.assertEquals(currentTitle, "Google Translate");
        Thread.sleep(3000);

    // Select Vietnamese as input
        if (driver.findElements(By.xpath("//div[@id='gt-lang-left']/div[@id='gt-lang-src']/div[@id='gt-sl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='vi']")).size() > 0)
        {
            WebElement Vi = driver.findElement(By.xpath("//div[@id='gt-lang-left']/div[@id='gt-lang-src']/div[@id='gt-sl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='vi']"));
            String isViSelected = Vi.getAttribute("aria-pressed");
            if (isViSelected.equals("false"))
            {
                Vi.click();
            }
        }
        else
        {
            WebElement allLangSrc = driver.findElement(By.id("gt-sl-gms"));
            allLangSrc.click();
            WebElement ViSrc = driver.findElement(By.xpath("//div[@id='goog-menuitem-group-7']/div[@id=':2r']/div"));
            ViSrc.click();
        }

    // Select English as output
        if (driver.findElements(By.xpath("//div[@id='gt-lang-right']/div[@id='gt-lang-tgt']/div[@id='gt-tl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='en']")).size() > 0)
        {

            WebElement En = driver.findElement(By.xpath("//div[@id='gt-lang-right']/div[@id='gt-lang-tgt']/div[@id='gt-tl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='en']"));
            String isEnSelected = En.getAttribute("aria-pressed");
            if (isEnSelected.equals("false"))
            {
                En.click();
            }
        }
        else
        {
            WebElement allLangTrg = driver.findElement(By.id("gt-tl-gms"));
            allLangTrg.click();
            WebElement EnTrg = driver.findElement(By.xpath("//div[@id='goog-menuitem-group-2']/div[@id=':3j']/div"));
            EnTrg.click();
        }

        WebElement Input = driver.findElement(By.id("source-is"));
        //Input.clear();
        Input.sendKeys("Ga");
        WebElement TranslateButton = driver.findElement(By.id("gt-submit"));
        TranslateButton.click();
        Thread.sleep(3000);

        WebElement Output = driver.findElement(By.xpath("//span[@id='result_box']/span"));
        String Outtext = Output.getText();
        Assert.assertEquals(Outtext, "Chicken");
    }

    @Test(priority=1)
    public void VietnameseToNorg() throws InterruptedException { 


    // Go to google translate
        driver.manage().window().maximize();
        driver.get("https://translate.google.com/");
        Thread.sleep(5000);

    // Check if the page is correct
        String currentTitle = driver.getTitle();
        Assert.assertEquals(currentTitle, "Google Translate");
        Thread.sleep(3000);

    // Select Vietnamese as input    
        if (driver.findElements(By.xpath("//div[@id='gt-lang-left']/div[@id='gt-lang-src']/div[@id='gt-sl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='vi']")).size() > 0)
        {
            WebElement Vi = driver.findElement(By.xpath("//div[@id='gt-lang-left']/div[@id='gt-lang-src']/div[@id='gt-sl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='vi']"));
            String isViSelected = Vi.getAttribute("aria-pressed");
            if (isViSelected.equals("false"))
            {
                Vi.click();
            }
        }
        else
        {
            WebElement allLangSrc = driver.findElement(By.id("gt-sl-gms"));
            allLangSrc.click();
            WebElement ViSrc = driver.findElement(By.xpath("//div[@id='goog-menuitem-group-7']/div[@id=':2r']/div"));
            ViSrc.click();
        }

    // Select Norg as output
        if (driver.findElements(By.xpath("//div[@id='gt-lang-right']/div[@id='gt-lang-tgt']/div[@id='gt-tl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='no']")).size() > 0)
        {

            WebElement No = driver.findElement(By.xpath("//div[@id='gt-lang-right']/div[@id='gt-lang-tgt']/div[@id='gt-tl-sugg']/div[contains(@class,'goog-inline-block jfk-button jfk-button-standard') and @value='no']"));
            String isNoSelected = No.getAttribute("aria-pressed");
            if (isNoSelected.equals("false"))
            {
                No.click();
            }
        }
        else
        {
            WebElement allLangTrg = driver.findElement(By.id("gt-tl-gms"));
            allLangTrg.click();
            WebElement NoTrg = driver.findElement(By.xpath("//div[@id='goog-menuitem-group-5']/div[@id=':52']/div"));
            NoTrg.click();
        }

        WebElement Input = driver.findElement(By.id("source-is"));
        //Input.clear();
        Input.sendKeys("Sua");
        WebElement TranslateButton = driver.findElement(By.id("gt-submit"));
        TranslateButton.click();    
        Thread.sleep(3000);

        WebElement Output = driver.findElement(By.xpath("//span[@id='result_box']/span"));
        String Outtext = Output.getText();
        Assert.assertEquals(Outtext, "Melk");
    }

    @AfterMethod
    public void tearDown(){ 
        driver.close();
        driver.quit();
        }
}
  

Комментарии:

1. Не по теме: вы должны извлечь эти повторяющиеся шаги настройки в отдельные методы, чтобы вы могли повторно использовать их в своих методах тестирования и сохранить их читаемыми: public void vietnameseToEnglish() { openGoogleTranslate(); verifyTitle(); selectVietnameseAsInput(); selectEnglishAsOutput(); setInput("Ga"); assertEquals(getOutput(), "Chicken"); }

2. Вы пробовали отлаживать свое приложение ? Какая ветвь вашей логики выполняется?

3. @MarkusMitterauer я знаю. Но я просто учусь, поэтому мне на самом деле легче отлаживать. Я уже печатаю шаги, и он фактически проходит этап нажатия на язык в таблице. Но я также не вижу никаких проблем с веб-драйвером.

Ответ №1:

Я бы сделал что-то вроде этого. Вы должны сосредоточиться на создании функций, которые выполняют одну задачу, чтобы у вас был повторно используемый код, который можно легко использовать в различных тестах.

Вот мои функции

 static public String getTranslatedText()
{
    new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>()
    {
        public Boolean apply(WebDriver d)
        {
            return d.findElement(By.id("result_box")).getText().length() != 0;
        }
    });
    return driver.findElement(By.id("result_box")).getText();
}

static public void setSourceLanguage(String lang)
{
    // see if the desired language is already selected
    if (!driver.findElement(By.cssSelector("#gt-lang-src div.jfk-button-checked")).getText().equals(lang))
    {
        // open the Source language dropdown
        driver.findElement(By.id("gt-sl-gms")).click();

        // select the desired language
        driver.findElement(By.xpath("//div[@id='gt-sl-gms-menu']//div[text()='"   lang   "']")).click();
    }
}

static public void setTargetLanguage(String lang)
{
    // see if the desired language is already selected
    if (!driver.findElement(By.cssSelector("#gt-lang-tgt div.jfk-button-checked")).getText().equals(lang))
    {
        // open the Source language dropdown
        driver.findElement(By.id("gt-tl-gms")).click();

        // select the desired language
        driver.findElement(By.xpath("//div[@id='gt-tl-gms-menu']//div[text()='"   lang   "']")).click();
    }
}

static public void translateText(String text)
{
    driver.findElement(By.id("source")).sendKeys(text);
}
  

Простой тест будет выглядеть так

 driver.get("https://translate.google.com/");
setSourceLanguage("English");
setTargetLanguage("Lao");
translateText("This is some text");
System.out.println(getTranslatedText());
  

После выполнения этого упражнения я заметил, что URL-адрес после перевода текста был https://translate.google.com/#en/lo/This is some text . Я предполагаю, что вы не тестируете Google Translate, а вместо этого просто хотите переводы? Если это правда, вы можете просто перейти к URL-адресу на основе языковых токенов и передать нужный текст.

URL-адрес имеет вид

 https://translate.google.com/#<source language token>/<target language token>/<text to be translated>
  

Таким образом, перевод с вьетнамского на английский будет

 https://translate.google.com/#vi/en/This is some text
  

и с вьетнамского на норвежский будет

 https://translate.google.com/#vi/no/This is some text
  

Тогда все, что вам нужно будет сделать, это захватить переведенный текст.