在 Python Selenium 的 xpath 中使用变量

Posted

技术标签:

【中文标题】在 Python Selenium 的 xpath 中使用变量【英文标题】:Using a variable in xpath in Python Selenium 【发布时间】:2015-12-28 17:42:37 【问题描述】:

我一直无法弄清楚如何让变量工作 Selenium。这篇文章似乎有所帮助 (Variable not working inside parenthesis),但我仍然无法正常工作。

当我使用实际值时,它会起作用。在这种情况下,阿拉巴马州。我创建了一个名为 state 的变量,这样我就可以调用 在我的功能中。我有 13 个州要经过。

driver.find_element_by_xpath("//option[@value='AL-Alabama']").click()

这个使用状态变量并在查看错误消息时将变量值显示为 AL-Alabama。所以看起来像 它在网页中引用了正确的值。不知道我错过了什么或为什么它不起作用。任何指导将不胜感激。

driver.find_element_by_xpath('//option[@value=' + state + ']').click()
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"xpath","selector":"//option[@value=AL-Alabama]"

【问题讨论】:

我将@EGHM 的帖子标记为答案。但是对于那些可能能够使用这些信息的人,我确实发现 Select 也确实有效。我使用了 Select(driver.find_element_by_class_name("c3")).select_by_visible_text(state)。不确定我是否应该将代码放在评论中。 @shavar 使用 Select 抽象确实是解决问题的更简洁的方法。 @alecxe 感谢您的意见。我很好奇 Select 是否是首选方法。在可能的情况下,我将使用 Select 抽象。当然,我还得再读一读它的用法。 【参考方案1】:

值周围的单引号不存在于您的编码方式中。试试:

driver.find_element_by_xpath("//option[@value='" + state + "']").click()

【讨论】:

是的,做到了。所以我猜它没有把它当作一个字符串来读?这将对我的其他项目有所帮助。谢谢。 我认为 python 将其作为字符串读取。我从大量经验中知道,Selenium 需要等号后的值周围的引号。 超级有用。谢谢。【参考方案2】:

如果您仍然想使用单引号,那么您也可以尝试这个答案。检查它是否有帮助:

driver.find_element_by_xpath('//option[@value=\'State_Name\']'.format(State_Name=State)).click()

或者干脆

driver.find_element_by_xpath('//option[@value=\'\']'.format(State)).click()

您可以在函数中将“状态”作为参数传递。

【讨论】:

【参考方案3】:

使用Selenium 和python 对元素上的click() 使用<option> 标签的变量value 属性,您可以使用以下任一Locator Strategies:

XPATH中使用变量:

state = 'AL-Alabama'
driver.find_element_by_xpath("//option[@value='" +state+ "']").click()

XPATH 中使用%s

state = 'AL-Alabama'
driver.find_element_by_xpath("//option[@value='%s']"% str(state)).click()

XPATH 中使用format()

state = 'AL-Alabama'
driver.find_element_by_xpath("//option[@value='']".format(str(state))).click()

最佳实践

理想情况下。使用 Selenium] 相对于 <option> 标记的变量 value 属性到元素上的 click() 并且您需要为 @987654339 诱导 WebDriverWait @ 并且您可以使用以下任一Locator Strategies:

XPATH中使用变量:

state = 'AL-Alabama'
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//option[@value='" +state+ "']"))).click()

XPATH 中使用%s

state = 'AL-Alabama'
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//option[@value='%s']"% str(state)))).click()

XPATH 中使用format()

state = 'AL-Alabama'
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//option[@value='']".format(str(state))))).click()

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

参考

您可以在以下位置找到一些相关讨论:

How to find an element with respect to the user input using Selenium and Python?

【讨论】:

以上是关于在 Python Selenium 的 xpath 中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

python+selenium基础之XPATH定位

python+selenium元素定位之XPath学习01

Python+Selenium基础篇之4-XPath的使用

Selenium 中的 Instagram XPath 不起作用? (Python)

Selenium2+python自动化7-xpath定位

在 Python Selenium 的 xpath 中使用变量