【问题标题】:Selecting Element by Tag Name with Specific Text - Selenium通过带有特定文本的标签名称选择元素 - Selenium
【发布时间】:2017-02-16 19:06:30
【问题描述】:

我有这个 HTML

<div class="callout callout-accordion" style="background-image: url(&quot;/images/expand.png&quot;);">
    <span class="edit" data-pk="bandwidth_bar">Bandwidth Settings</span>
    <span class="telnet-arrow"></span>
</div>

我正在尝试选择 span,文本 = Bandwidth Settings,然后点击类名 = calloutdiv

if driver.find_element_by_tag_name("span") == ("Bandwidth Settings"):
    print "Found"
    time.sleep(100)
    driver.find_element_by_tag_name("div").find_element_by_class_name("callout").click()


print "Not found"
time.sleep(100)

我一直得到

Testing started at 1:59 PM ...
Not found

Process finished with exit code 0

我错过了什么?


选择父分区

    if driver.find_element_by_xpath("//span[text()='Bandwidth Settings']") is None:
        print "Not Found"
    else :
        print "Found"
        span = driver.find_element_by_xpath("//span[text()='Bandwidth Settings']")
        div = span.find_element_by_xpath('..')
        div.click()

我明白了

WebDriverException:消息:未知错误:元素

【问题讨论】:

  • driver.find_element_by_tag_name("span") 会找到多个元素
  • 哦。我懂了。如何选择带有text == 'string' 的跨度?
  • 请尝试使用class代替span driver.FindElement(By.ClassName("Edit")).Text
  • 我得到了这个AttributeError: 'WebDriver' object has no attribute 'FindElement' - 我需要导入什么才能使用它?

标签: python selenium webdriver automated-tests


【解决方案1】:

一种方法是像这样使用find_element_by_xpath(xpath)

if driver.find_element_by_xpath("//span[contains(.,'Bandwidth Settings')]") is None:
   print "Not found"
else:
   print "Found"
   ...

对于完全匹配(正如您在评论中要求的那样)使用 "//span[text()='Bandwidth Settings']"

在您编辑过的问题上,尝试以下方法之一:

直接定位(如果没有其他匹配元素):

driver.find_element_by_css_selector("div[style*='/images/telenet/expand.png']")

通过 span 定位(前提是该级别没有其他 div):

driver.find_element_by_xpath("//span[contains(.,'Bandwidth Settings')]/../div")

【讨论】:

  • 如何选择那个的父div??
  • 我试过driver.find_element_by_css_selector("div.callout").click(),它点击它找到的第一个:(
  • 所有find_elementmethods 都旨在返回匹配的first 元素。所以你应该使用它们,如果你有一个 unique 定位器(或者你不关心页面上的其余数学元素)。或者,您可以使用find_elements 方法(注意复数形式),它返回所有匹配WebElement 对象的列表。然后,您可以迭代该列表。但是我不是很喜欢 python 来给你一个语法正确的例子。
  • 我试过if driver.find_element_by_xpath("//span[text()='Bandwidth Settings']") is None: print "Not Found" else : print "Found" span = driver.find_element_by_xpath("//span[text()='Bandwidth Settings']") div = span.find_element_by_xpath('..') div.click()
  • @Würgspaß,错了! span=driver.find_element_...(...) span.find_element_...(...) 是正确的语法
【解决方案2】:

你需要使用的代码:

from selenium.common.exceptions import NoSuchElementException

try:
    span = driver.find_element_by_xpath('//span[text()="Bandwidth Settings"]')
    print "Found"
except NoSuchElementException:
    print "Not found"

如果需要选择父div元素:

div = span.find_element_by_xpath('./parent::div')

【讨论】:

    【解决方案3】:

    如果您在页面上发出嘶嘶声(jQuery),您可以通过它们的文本选择跨度,如下所示:

    $("span:contains('带宽设置')")

    使用 C# 绑定会像这样选择哪个

    By.CssSelector("span:contains('Bandwidth Settings')")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2022-01-15
      • 2019-05-29
      • 2020-12-07
      • 2023-03-19
      • 2014-04-22
      • 1970-01-01
      相关资源
      最近更新 更多