【问题标题】:How to click a javascript enabled anchor element using Selenium and Python如何使用 Selenium 和 Python 单击启用了 javascript 的锚元素
【发布时间】:2020-06-08 12:40:16
【问题描述】:

这是我试图点击的元素的 html:

<a id="sd3" class="node"
href="/cgi-bin/luci/;stok=753940cb907c7e8524cfaf3c5227614c/expert/configuration/network/wlan" 
target="mainFrame" onclick="javascript: d.s(3);">Wireless LAN 2.4G</a>

这是引发的错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element

在 F12 检查屏幕中,这是 xpath:

//*[@id="sd3"]

这是选择器:

#sd3

这是完整的 xpath:

/html/body/div[3]/div/ul/li[2]/div/ul/li/div/ul/li[3]/div/div/div[2]/div[2]/div[2]/a

我尝试了所有这些:

driver.find_element_by_link_text(url).click()
driver.find_element_by_xpath("//dTreeNode[3]").click()
driver.find_element_by_partial_link_text('url').click()
driver.find_element_by_css_selector('a.node').click()
driver.find_element_by_xpath("//dd1[2]").click()
driver.find_element_by_css_selector('a#sd3').click()
driver.find_element_by_css_selector(".node[id='sd3']").click()
driver.find_element_by_xpath("//a[@id='sd3']").click()
driver.find_element_by_link_text('Wireless LAN 2.4G').click()
driver.find_element_by_xpath("//div[@id='dd1']/div[2]/a[1]").click()
driver.find_element_by_xpath("//div[@id='dd1']/div[2]/a[@id='sd3']").click()
driver.find_element_by_xpath("//a[@id='sd3']").click()
driver.find_element_by_id("sd3").click()
driver.find_element_by_link_text('Wireless LAN 2.4G').click()
driver.find_element_by_xpath("/html/body/div[3]/div/ul/li[2]/div/ul/li/div/ul/li[3]/div/div/div[2]/div[2]/div[2]/a").click()
driver.find_element_by_xpath("//*[@id='sd3']").click()

结论: 我必须承认,我发现自己完全无能为力地发现,尽管我进行了各种不同的尝试,但还是提出了同样的例外。然而,我在我的脚本前面使用了同一行代码,它就像一角钱一样工作。我什至试图给内容生成时间(3 秒),因为它是动态生成的。我得出了两个结论。我要么是我找不到的问题,要么这是一些动态生成的内容,这给 Selenium 增加了一层我没有得到的复杂性。

【问题讨论】:

  • 网页上有&lt;iframe&gt;吗?
  • 总是放 URL,这样我们就可以看到完整的 HTML 并在浏览器中测试它。
  • 您是否尝试过更长的睡眠时间 - 即。 10 秒?
  • @frianH 不,没有 iframe。
  • @furas 这是我的网关路由配置网页,所以它只是本地的,对不起。我确实尝试了更长的时间,但也没有用。

标签: python selenium xpath css-selectors linktext


【解决方案1】:

&lt;a&gt; 元素是启用了JavaScript 的元素。所以在元素上click()你需要诱导WebDriverWaitelement_to_be_clickable(),你可以使用以下Locator Strategies之一:

  • 使用LINK_TEXT

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Wireless LAN 2.4G"))).click()
    
  • 使用PARTIAL_LINK_TEXT

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Wireless LAN 2"))).click()
    
  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.node[href$='/expert/configuration/network/wlan']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='node' and contains(@href, 'expert/configuration/network/wlan')][contains(., 'LAN 2.4G')]"))).click()
    
  • 注意:您必须添加以下导入:

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

注意:您可以在Selenium “selenium.common.exceptions.NoSuchElementException” when using Chrome找到相关讨论

【讨论】:

  • 感谢您的回答。我尝试了所有 3 个,结果如下: Traceback(最近一次调用最后一次):文件“C:\Users\EliteBook8460p\Desktop\Selenium\selenium wifi soft.py”,第 53 行,在 WebDriverWait(driver, 20 ).until(EC.element_to_be_clickable((By.LINK_TEXT, "Wireless LAN 2.4G"))).click() 文件 "C:\Users\EliteBook8460p\AppData\Local\Programs\Python\Python36-32\lib\site -packages\selenium\webdriver\support\wait.py",第 80 行,直到引发 TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
  • @David 您是否查看了有关如何解决 NoSuchElementException 的参考讨论?
  • 我会检查的!非常感谢
猜你喜欢
  • 2020-04-26
  • 2021-12-09
  • 1970-01-01
  • 2022-11-01
  • 2021-03-31
  • 1970-01-01
  • 2021-12-28
  • 2020-04-22
相关资源
最近更新 更多