NameError:XPATH使用Selenium查找元素时未定义名称“ btn”

时间:2018-12-19 01:32:23

标签: python selenium selenium-webdriver xpath

从chrome元素检查器复制的Xpath和选择器信息:

<button class="btn btn-white btn--no-margin btn--full-width _1XvaFLD3_IpAQNG-OJU2-H _1xNlj_ScH8hEMWzrkRt1A">Sign up</button>

CssSelector:

#main > div > div.Root__top-container.Root__top-container--has-notice-bar > div.Root__nav-bar.Root__nav-bar--has-notice-bar > nav > div.navBar-signupPrompt._3nonY0buM5Z1AF4aRrP8VY > p:nth-child(1) > button

我试图找到的:

button = wd.find_element(By.XPATH("//button[contains(text(),'"+btn-white+"')]"))

哪个返回错误为:

NameError: name 'btn' is not defined

我发现this向我展示了如何通过部分名称进行查找。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

btn-whitebutton元素中的类,而不是文本。而且您不能将其用作变量,它必须是str参数

button = wd.find_element_by_class_name('btn-white')

button = wd.find_element(By.CLASS_NAME, 'btn-white')

如果您想按Sign up文本查找

button = wd.find_element(By.XPATH, '//button[.="Sign up"]')

答案 1 :(得分:-1)

它对您来说更好吗?

button = wd.find_element(By.XPATH("//button[text()='Sign up']"))

答案 2 :(得分:-1)

尝试:

wd.find_element(By.XPATH("//button[contains(text(),'Sign up')]"))

答案 3 :(得分:-1)

此错误消息...

NameError: name 'btn' is not defined

...表示您尝试使用程序中未定义的变量 btn

根据您提供的HTML:

<button class="btn btn-white btn--no-margin btn--full-width _1XvaFLD3_IpAQNG-OJU2-H _1xNlj_ScH8hEMWzrkRt1A">Sign up</button>

您的代码试用朝着正确的方向发展。但是表达式:

button = wd.find_element(By.XPATH("//button[contains(text(),'"+btn-white+"')]"))

...表示 btn-white 是一个变量,您可能并不是真的意思,并且在程序中也没有定义。因此,您应该看到以下错误:

NameError: name 'btn-white' is not defined

类似的情况是该错误:

NameError: name 'btn' is not defined

解决方案

一个有效的解决方案是使用以下Locator Strategies中的任何一个:

  • xpath

    button = wd.find_element(By.XPATH("//button[contains(@class,'btn-white') and text()='Sign up']"))
    
  • xpath

    button = wd.find_element(By.XPATH("//button[contains(@class,'btn--no-margin') and text()='Sign up']"))
    
  • xpath

    button = wd.find_element(By.XPATH("//button[contains(@class,'btn--full-width') and text()='Sign up']"))
    
  • xpath

    button = wd.find_element(By.XPATH("//button[contains(@class,'btn--full-width') and contains(@class,'btn--no-margin')][text()='Sign up']"))