Selenium Java API почему driver.findElement(By.tagName(«title»)).getText() всегда возвращает пустой

#java #selenium #selenium-webdriver #title #selenium-chromedriver

#java #селен #selenium-webdriver #Название #selenium-chromedriver

Вопрос:

Я использую Selenium2 with Java API Version 2.53.1 и chrome driver Version 2.24 для распечатки нескольких значений.

Но для тега: <title>test</title> функция driver.findElement(By.tagName("title")).getText(); всегда возвращает пустой.

Мой вопрос в том, как заставить функции API снова работать?

Кстати: Selenium3 бета-версия и сломана для chromedriver и geckodriver тоже!

С другой стороны, функции:-

driver.findElement(By.tagName("title")).getTagName(); и driver.getTitle(); возвращает правильные значения.

Я пытался обойти проблему с помощью кода JavaScript, но безрезультатно:

 JavascriptExecutor js;
    if (driver instanceof JavascriptExecutor) {
        js = (JavascriptExecutor)driver;

        a_tag_name_title = (ArrayList<RemoteWebElement>) js.executeScript("return document.getElementsByTagName('title');");


        System.out.println("Is empty? "   a_tag_name_title.isEmpty());
        for (RemoteWebElement object: a_tag_name_title){
            System.out.println("Title tag: "   object.getText());
        }
        found = false;

        for (RemoteWebElement object: a_tag_name_title){

            found = object.getText().contains("title");
        }
        assertTrue("Title tag not found", found); //sanitiy check if "getElementsByTagName" is working, too

    }
 

Ответ №1:

Фактически WebElement#getText() возвращает видимый innerText элемент на странице, в то время innerText как внутренний <title> тег не отображается на странице, поэтому вы получаете пустой текст.

Чтобы определить перед использованием WebElement#getText() , виден этот элемент или нет, используйте :-

 driver.findElement(By.tagName("title")).isDisplayed();
 

Если вы используете приведенную выше инструкцию, вы можете видеть, что она всегда возвращается false .

Чтобы обойти это, вы можете использовать WebElement#getAttribute("textContent") или WebElement#getAttribute("innerText") , как показано ниже :-

 driver.findElement(By.tagName("title")).getAttribute("textContent")

driver.findElement(By.tagName("title")).getAttribute("innerText")
 

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

1. Кажется, что это было бы намного проще в использовании driver.getTitle(); .

2. @JeffC вы правы, OP уже использует его, и он работает нормально, но ему любопытно узнать, почему driver.findElement(By.tagName("title")).getText(); возвращает пустой?? Спасибо, чтобы указать на это