如何使用硒Python单击javascript超链接元素

时间:2020-01-04 07:57:50

标签: python selenium selenium-webdriver

我的目标是使用selenium python单击此超链接元素,这是我尝试过的3种解决方案,但没有一个起作用。

<div class="navigation_item">
<a href="javascript:;" onclick="navigationMenu('students');">Students (165)</a>
</div>

解决方案1:

driver.find_element_by_link_text('Students (165)').click()

错误消息:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“方法”:“链接文本”,“选择器”:“学生(165)”}

解决方案2:

driver.find_element_by_xpath('/html/body/div[2]/div[1]/div[3]/div/div[1]/div[3]/div[7]/a').click()

错误消息:selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“ method”:“ xpath”,“ selector”:“ / html / body / div [2] / div [1] / div [3] / div / div [1] / div [3] / div [7] / a“}

解决方案3:使用JavaScript代码

javascript = "document.getElementsByClassName('navigation_item')[3].click();"
driver.execute_script(javascript)

错误消息:selenium.common.exceptions.JavascriptException:消息:javascript错误:无法读取未定义的属性“ click”

那么,每个解决方案出了什么问题?我该如何运作?

2 个答案:

答案 0 :(得分:-1)

它可能会引发错误,因为在检查元素时未加载页面。尝试使用:

browser = webdriver.Firefox()

browser.implicitly_wait(5)

然后,您可以使用第一个解决方案: driver.find_element_by_link_text('Students (165)').click()

这应该在查找元素设置超时5秒后触发。

答案 1 :(得分:-1)

要单击文本为学生(165)的元素,您必须为element_to_be_clickable()引入 WebDriverWait ,并且可以使用以下任一{ {3}}:

  • 使用LINK_TEXT

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Students (165)"))).click()
    
  • 使用PARTIAL_LINK_TEXT

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.navigation_item>a[onclick^='navigationMenu'][onclick*='students']"))).click()
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='navigation_item']/a[starts-with(@onclick, 'navigationMenu') and contains(., 'Students')]"))).click()
    
  • 注意:您必须添加以下导入:

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