selenium -如何可靠地点击文本?

vyswwuz2  于 2023-02-04  发布在  其他
关注(0)|答案(6)|浏览(221)

我尝试点击文本链接,但不起作用:

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()

超文本:

<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>

我做错了什么?

ifsvaxew

ifsvaxew1#

试试下面的一个,希望有帮助。

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

eulz3vhy2#

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

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

dsf9zpds3#

在Selenium中,XPath查找对于没有指定标记名的元素的递归搜索有点混乱,所以不要使用://*[].
此外,XPath有点混乱。在示例中,您正在搜索一个元素,该元素具有名为"span"的属性,该属性包含whatever字符串。
它应该如下所示:
driver.find_element_by_xpath("//a[contains(string(.),'For Sale']").click()
如果你愿意,你可以试试germanium,这是我写的一个免费测试框架,它可以处理这种不一致性和更多问题。click(Text("Other Home Appliances"))

wvmv3b1j

wvmv3b1j4#

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

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

使用这个的原因是,如果你的HTML代码包含两个或多个带有单词“Appliances”的元素,它不会选择任何元素。因此,为了避免这种歧义,我们可以直接使用text()=
希望这个有用。

vltsax25

vltsax255#

XPath中的这种 contains 可以用在高级场景中,比如:

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

@编辑:

您可以使用$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()
z4bn682m

z4bn682m6#

您提供的HTML未显示设备范围包含大量空白,这可能是您找不到此元素的原因。请尝试以下Xpath查找设备范围,

//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()

相关问题