selenium.common.exceptions.NoSuchElementException: Сообщение: невозможно найти элемент: // pre / * [not (self :: b)] - PullRequest
1 голос
/ 17 мая 2019

https://www.codechef.com/ACMIND17/problems/STDDEV/ Я пытаюсь получить ввод и вывод следующего вопроса, используя скрипт Python, но получаю следующую ошибку

selenium.common.exceptions.NoSuchElementException: Сообщение: невозможно найти элемент: // pre / * [not (self :: b)]

Вы можете легко обнаружить, что pre и b присутствуют в исходном коде, а b является потомком pre, чем эта ошибка, которую я просто пытаюсь исключить из тегов b

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get('https://www.codechef.com/ACMIND17/problems/STDDEV/')
str=driver.find_element_by_xpath("//pre/*[not(self::b)]").text;
print(str);

Я только начал изучать все это сегодня, так что извините, если это что-то глупое

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

К сожалению, метод selenium find_element ожидает элемент в качестве возвращаемого значения, поэтому мы не можем использовать //pre/text()[1] для ввода или //pre/text()[2] для вывода. Таким образом, мы должны передать JavaScript, чтобы получить желаемый результат.

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

Примечание: textPosition в методе - это не что иное, как индекс текстового узла. Например, в этом случае входное значение является первым текстовым узлом, выходное значение - вторым текстовым узлом.

def get_text_from_parent_by_postion(element, textPosition=1):
    return driver.execute_script(
        """ var parent = arguments[0];
            var textPosition = arguments[1];
            var txtPosition = 0;
            var child = parent.firstChild;
            var textValue="";
            while(child) {
              if (child.nodeType === 3){                        
                if (txtPosition===textPosition){
                  textValue = child.textContent;                
                  break;
                }}else{txtPosition+=1;}
              child = child.nextSibling;
            }
        return textValue;""",
        element, textPosition).strip()

Как это назвать в вашем случае:

# print input
print(get_text_from_parent_by_postion(driver.find_element_by_tag_name("pre"),1))
#print output
print(get_text_from_parent_by_postion(driver.find_element_by_tag_name("pre"),2))
0 голосов
/ 17 мая 2019

Получает весь текст в @ id = "проблема-постановка"

str=driver.find_element_by_xpath('//*[@id="problem-statement"]').text
print(str[str.find('Input'):str.find('Constraints')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...