Selenium - 无法在"文档"上执行'evaluate':字符串不是有效的 XPath 表达式



有以下页面。

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

当您单击选择时,将显示一个包含国家/地区的列表。我尝试选择一个国家,例如哥伦比亚并单击它。但是我得到一个错误。

语法错误:无法对"文档"执行"评估":字符串 '//span[contains(@class, 'md_countryName_fdxiah8' and text((, "哥伦比亚"(]"不是有效的 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')]")

此错误消息...

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表达式。

看来你很接近。您可以使用以下任一定位器策略:

  • 使用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')]")
    

在这里,您可以找到有关语法错误的相关讨论:无法对"文档"执行"评估":字符串"//img[contains('1236548597'(]"不是有效的 XPath 表达式


更新

要克服元素不可见的错误,您需要诱导WebDriverWaitvisibility_of_element_located(),您可以使用以下任一定位器策略

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

也许您正在尝试这样的事情(根据需要按如下方式更改 xpath(:

请注意,此处的文本节点应等于"哥伦比亚"://span[contains(@class, 'md_countryName_fdxiah8') and text()='Colombia']

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

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

看起来您忘记将链接附加到页面。无论如何,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>'

根据我的经验,Select 元素最好使用 Select 函数对象进行处理。然后每个列表都可以通过其文本进行寻址

您应该导入:

from selenium.webdriver.support.ui import Select

然后

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

最新更新