Selenium - 如何可靠地点击文字?还没有完全解决

时间:2016-05-02 11:15:57

标签: python html selenium web selenium-webdriver

我试图点击文字链接,但这不起作用:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://my.gumtree.com/login")
driver.find_element_by_name("username").send_keys(email)
driver.find_element_by_id("existingUser").click()
driver.find_element_by_id("fld-password").send_keys(password)
driver.find_element_by_xpath("//*[contains(text(), 'Continue')]").click() # works

driver.get("https://my.gumtree.com/postad")
driver.find_elements_by_xpath("//*[text()='For Sale']")[-1].click() # this now works, thanks
# driver.find_element_by_xpath("//*[contains(@span,'Appliances']").click() # this worked but I need the next line instead
driver.find_element_by_xpath("//span[text()[normalize-space()='Phones, Mobile Phones & Telecoms']]").click() # this does not work
driver.find_element_by_xpath("//span[text()[normalize-space()='Phones, Mobile Phones & Telecoms']]").click() # this does not work either
driver.find_element_by_xpath("//span[text()[normalize-space()='Mobile Phones']]").click()
driver.find_element_by_xpath("//span[text()[normalize-space()='Other']]").click()

HTML:

<li class="border-b is-parent" data-category-name="Appliances" data-category-url="kitchen-appliances" data-category-id="2485" data-category-children="true">
  <span class="category-name">
    <span class="category-list-control is-parent">
    </span>
    Appliances
  </span>
</li>

我做错了什么?

文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本

6 个答案:

答案 0 :(得分:1)

在Selenium中,XPath发现它对于没有指定标记名称的元素的递归搜索有点破碎。所以请勿使用://*[]

此外,XPath有点破碎。在您的示例中,您正在搜索具有名为&#34; span&#34;的属性的元素。包含任何字符串。

它应该是这样的:

driver.find_element_by_xpath("//a[contains(string(.),'For Sale']").click()

如果您愿意,可以尝试germanium,这是我编写的免费测试框架,可以处理这种不一致等问题。在锗中,相同的代码如下所示: click(Text("Other Home Appliances"))

答案 1 :(得分:1)

尝试以下方法。希望它有所帮助。

driver.find_element_by_xpath("//*[text()='For Sale']") 

答案 2 :(得分:1)

根据提供的HTML代码,我希望它能正常工作

 //span[contains(text(),'For Sale')] 

谢谢, 穆拉利

答案 3 :(得分:0)

您提供的HTML未显示Appliances span包含大量空格,这可能是您找不到此元素的原因。尝试使用以下Xpath来查找Appliances span,

//span[text()[normalize-space()='Appliances']]

以下是我使用的脚本

from selenium import webdriver

email, password = 'your-own-email', 'your-own-password'
driver = webdriver.Firefox()
driver.implicitly_wait(10)

driver.get("https://my.gumtree.com/login")
driver.find_element_by_name("username").send_keys(email)
driver.find_element_by_id("existingUser").click()
driver.find_element_by_id("fld-password").send_keys(password)
driver.find_element_by_xpath("//*[contains(text(), 'Continue')]").click()

driver.get("https://my.gumtree.com/postad")
driver.find_elements_by_xpath("//*[text()='For Sale']")[-1].click()
driver.find_element_by_xpath("//span[text()[normalize-space()='Appliances']]").click()
driver.find_element_by_xpath("//span[text()[normalize-space()='Home Appliances']]").click()
driver.find_element_by_xpath("//span[text()[normalize-space()='Other Home Appliances']]").click()

对于那些不在视野中的元素,请使用以下方法,

element = driver.find_element_by_xpath("//span[text()[normalize-space()='Phones, Mobile Phones & Telecoms']]")
driver.execute_script("return arguments[0].scrollIntoView();", element)
element.click()

答案 4 :(得分:0)

如果HTML代码中有固定字符串,则无需在xpath中使用contains()方法。请使用xpath的text()方法:

driver.findElement(By.xpath(.//*[text()='Appliances'])).click();

使用此功能的原因是,如果您的HTML代码包含两个或多个带有“Applicances”字样的元素,则不会选择任何元素。因此,为了避免这种歧义,我们可以直接使用text()=

希望这有帮助。

答案 5 :(得分:0)

XPath中的这种包含可用于高级场景,例如:

//span[text()[contains(.,'Appliances')]]

<强> @Edit:

您可以使用$x("selector")在Google Chrome中测试此主题中的所有XPath响应。也许问题出在你的硒版本中。

我真的不知道python语法(我曾经在C#中创建测试),但你可以做一个可行的丑陋代码。尝试将代码更改为python,我认为有一些错误:

elements = driver.find_elements_by_cssselector("span.category-name")

for element in elements:
    if (element.text == "Appliances" || element.text == "Home Appliances" || element.text == "Other Home Appliances")
        element.click()