#java #selenium #selenium-webdriver
#java #selenium #selenium-webdriver
Вопрос:
Я тестирую Selenium-Webdriver на странице Google Translate. То, что я пытаюсь сделать, это:
- Посмотрите, представлен ли уже язык ввода
- Если он представлен, выбран ли он? Если нет, выберите его.
- Если нет, откройте таблицу more language. Выберите (щелкните) язык в таблице.
- Посмотрите, представлен ли уже язык вывода
- Если он представлен, выбран ли он? Если нет, выберите его.
- Если нет, откройте таблицу more language. Выберите (щелкните) язык в таблице.
- Наконец, переведите и проверьте результат
У меня нет никаких проблем со случаем 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
Тогда все, что вам нужно будет сделать, это захватить переведенный текст.