【问题标题】:selenium - Failed to execute 'evaluate' on 'Document': The string is not a valid XPath expressionselenium - 无法在“文档”上执行“评估”:字符串不是有效的 XPath 表达式
【发布时间】:2019-12-25 11:30:22
【问题描述】:

有以下页面。

http://remitly.com/us/en/

当您单击某个选项时,会出现一个包含国家/地区的列表。我尝试选择一个国家,例如哥伦比亚,然后单击它。但我得到一个错误。

语法错误:无法对“文档”执行“评估”:字符串 '//跨度[包含(@class,'md_countryName_fdxiah8'和文本(), 'Colombia')]' 不是有效的 XPath 表达式。

select = driver.find_element_by_class_name('f1wrnyr7')
select.click()
countries = driver.find_element_by_class_name('f1o6pohl')
country = countries.find_element_by_xpath("//span[contains(@class, 'md_countryName_fdxiah8' and text(), 'Colombia')]")

【问题讨论】:

    标签: python python-3.x selenium xpath xpath-1.0


    【解决方案1】:

    此错误消息...

    SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//span[contains(@class, 'md_countryName_fdxiah8' and text(), 'Colombia')]' is not a valid XPath expression.
    

    ...暗示您使用的 XPath 不是有效的 XPath 表达式。

    看来你已经很接近了。您可以使用以下任一Locator Strategies

    • 使用xpath 1

      country = countries.find_element_by_xpath("//span[contains(@class, 'md_countryName_fdxiah8') and text()='Colombia']")
      
    • 使用xpath 2

      country = countries.find_element_by_xpath("//span[contains(@class, 'md_countryName_fdxiah8') and contains(., 'Colombia')]")
      

    在这里你可以找到SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//img[contains('1236548597')]' is not a valid XPath expression的相关讨论


    更新

    要克服 element not visible 错误,您需要为 visibility_of_element_located() 引入 WebDriverWait,并且您可以使用以下任一 Locator Strategy

    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[contains(@class, 'md_countryName_fdxiah8') and text()='Colombia']")))
    

    【讨论】:

    • 但是当我点击一个元素时,我得到一个element not visible 错误。试图设置time.sleep(5)
    • @ДмитрийДмитрук 查看答案更新并告诉我状态。
    • raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
    • @ДмитрийДмитрук 查看答案更新并告诉我状态。
    • 检查更改日志。观察网址后,我将忠诚度从countries 转移到driver
    【解决方案2】:

    也许您正在尝试这样的事情(根据您的需要更改 xpaths 如下):

    注意这里的文本节点应该等于'Colombia': //span[contains(@class, 'md_countryName_fdxiah8') and text()='Colombia']

    或者,文本节点可能包含一些长文本,但该文本中还应包含“哥伦比亚”:

    //span[contains(@class, 'md_countryName_fdxiah8') and contains(text(), 'Colombia')]

    【讨论】:

    • 但是当我点击一个元素时,我得到一个element not visible 错误。试图设置time.sleep(5)
    【解决方案3】:

    您好像忘记在页面上附加链接了。反正XPath表达式是无效的,修正后的版本可能是:

    //span[contains(@class, 'md_countryName_fdxiah8') and text()='Colombia']\
    

    您可以使用以下 XML 对其进行测试:

    <span class="md_countryName_fdxiah8">Colombia</span>
    

    结果:

    Element='<span class="md_countryName_fdxiah8">Colombia</span>'
    

    【讨论】:

    • 但是当我点击一个元素时,我得到一个element not visible 错误。试图设置time.sleep(5)
    • 很高兴看到目标页面,看不到您问题中的链接。也许你需要类似wait.until(EC.visibility_of_element_located((By.XPATH, "//span[contains(@class, 'md_countryName_fdxiah8') and text()='Colombia']")))
    【解决方案4】:

    根据我的经验,使用 Select 函数对象可以更好地处理 Select 元素。然后每个列表 contnet 都可以通过它的文本来寻址

    你应该导入:

    from selenium.webdriver.support.ui import Select
    

    然后

    select = Select(driver.find_element_by_class_name('f1wrnyr7'))
    select.select_by_visible_text('Colombia')
    

    【讨论】:

    • 其实不是select
    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 2019-02-03
    • 2021-08-30
    • 1970-01-01
    • 2018-10-28
    • 2015-05-08
    • 1970-01-01
    • 2018-10-07
    相关资源
    最近更新 更多