selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:// pre / * [not(self :: b)]

时间:2019-05-16 21:20:35

标签: python selenium xpath

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 :(得分:0)

获取@ id =“ problem-statement”中的所有文本

str=driver.find_element_by_xpath('//*[@id="problem-statement"]').text
print(str[str.find('Input'):str.find('Constraints')])

答案 1 :(得分:0)

不幸的是,硒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))