【问题标题】:Python + Selenium: I can't find an element on my router 'site'Python + Selenium:我在路由器“站点”上找不到元素
【发布时间】:2018-06-07 23:45:47
【问题描述】:

我正在尝试编写一个 Python 脚本来自动从我的路由器站点 (10.0.0.2) 更改我的 Wi-Fi 密码。我正在使用 Selenium,但我一直在碰壁,因为我找不到一些元素。您的帮助将不胜感激。我将在下面提供调试所需的所有资源:

我通过 XPath 找到元素成功登录到我的路由器。

找到提交/登录按钮并点击它:

browser.find_element_by_xpath('//input[@type="submit"]').send_keys(Keys.ENTER)`

另外,我尝试了几种方法来查找元素,但我暂时将它们注释掉了。

#Locate Advanced Tab --1
browser.find_element_by_name("Advanced").click()

#Locate Advanced Tab --2
#tt1 = browser.find_element_by_xpath("//td[@id='topnav1']")
#tt1.click()

[1]#Locates the the advance tab on the page -- 3
#adv = browser.find_element_by_id('topnav1')
#adv.send_keys(Keys.RETURN)

这是我路由器中“高级”选项卡的代码:

<td id="topnav1" class="topnavoff" width="140"><a       href="javascript:ontopnav('1')">Advanced</a></td>

已编辑:分别是代码和错误。

browser.find_element_by_link_text("Advanced").click()

Traceback(最近一次调用最后一次): 文件“celenium.py”,第 22 行,在 browser.find_element_by_link_text("高级").click() 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 337 行,在 find_element_by_link_text return self.find_element(by=By.LINK_TEXT, value=link_text) 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 791 行,在 find_element '价值':价值})['价值'] 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 256 行,在执行中 self.error_handler.check_response(响应) 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py”,第 194 行,在 check_response 引发异常类(消息、屏幕、堆栈跟踪) selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:高级


browser.find_element_by_css_selector("#topnav1>a").click()

Traceback(最近一次调用最后一次): 文件“celenium.py”,第 20 行,在 browser.find_element_by_css_selector("#topnav1>a").click() 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 457 行,在 find_element_by_css_selector return self.find_element(by=By.CSS_SELECTOR, value=css_selector) 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 791 行,在 find_element '价值':价值})['价值'] 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 256 行,在执行中 self.error_handler.check_response(响应) 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py”,第 194 行,在 check_response 引发异常类(消息、屏幕、堆栈跟踪) selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:#topnav1>a


browser.find_element_by_css_selector("td.topnavoff#topnav1 > a ").click()

Traceback(最近一次调用最后一次): 文件“celenium.py”,第 22 行,在 browser.find_element_by_css_selector("td.topnavoff#topnav1 > a").click() 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 457 行,在 find_element_by_css_selector return self.find_element(by=By.CSS_SELECTOR, value=css_selector) 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 791 行,在 find_element '价值':价值})['价值'] 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 256 行,在执行中 self.error_handler.check_response(响应) 文件“C:\Users\Aesop\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py”,第 194 行,在 check_response 引发异常类(消息、屏幕、堆栈跟踪) selenium.common.exceptions.NoSuchElementException:消息:无法定位元素:td.topnavoff#topnav1 > a


来自路由器站点的代码片段:

<table id=topnav_container2 cellspacing=0 border=0>
        <tbody>
        <tr>
          <td style="width: 1px; background-color: white"></td>
          <td id=modnum rowspan=2><img alt="" src="pic/DSL-G225.gif"></td>
          <td style="width: 2px; background-color: white"></td>
          <td id=topnav0 class=topnavon width=140 rowspan=2><a href="javascript:ontopnav('0')" >Setup</a></td>
          <td style="width: 2px; background-color: white"></td>
          <td id=topnav1 class=topnavoff width=140><a href="javascript:ontopnav('1')">Advanced</a></td>
          <td style="width: 2px; background-color: white"></td>
          <td id=topnav2 class=topnavoff width=140><a href="javascript:ontopnav('2')">Maintenance</a></td>
          <td style="width: 2px; background-color: white"></td>
          <td id=topnav3 class=topnavoff width=140><a href="javascript:ontopnav('3')">Status</a></td>
          <td style="width: 2px; background-color: white"></td>
          <td id=topnav4 class=topnavoff width=140><a href="javascript:ontopnav('4')">Help</a></td>
          <td style="width: 2px; background-color: white"></td>
        </tr>
        <tr>
          <td></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
          <td style="background-color: #404343"></td>
        </tr>
        </tbody>
      </table>

【问题讨论】:

  • 你的页面上有框架吗?
  • @Ratmir 是的,先生。
  • @Originull 当你说你有frames,你是否切换到确切的frame?发布更多包含&lt;frame&gt; 标签的outerHTML 和您的代码试用以切换帧。

标签: python selenium xpath automation


【解决方案1】:

要单击带有 Advanced 文本的 link,您可以使用以下任何代码行:

  • css_selector

    browser.find_element_by_css_selector("table#topnav_container2 tr td.topnavoff#topnav1 > a").click()
    
  • xpath

    browser.find_element_by_xpath("//table[@id='topnav_container2']//tr//td[@class='topnavoff' and @id='topnav1']/[contains(.,'Advanced')]").click()    
    

注意:带有 Advanced 文本的 link&lt;a&gt; 标记内。因此,您必须尝试调用强大的 click() 方法,而不是 send_keys(Keys.RETURN)send_keys(Keys.ENTER),如下所示:

browser.find_element_by_link_text("Advanced").click() 

【讨论】:

  • 非常感谢......虽然我仍然有这个错误。我不认为 Advanced 本身就是一个链接。这就是为什么我认为很难找到它。 :( 我已经尝试过你的方法 Ratmir 和 DebanjanB,再次感谢你,但我仍然失败了。
  • @Originull 更新了我的答案。让我知道状态。请参阅&lt;a&gt; 标记定义了href 属性,并将值设置为javascript:ontopnav('1')。所以它绝对是一个链接。 仍然失败并不能说明正在发生的事情。使用您最新的代码试验和错误堆栈跟踪更新问题,以便 SO 志愿者可以帮助您。
  • xpathcss 根据 HTML 看起来不错。你能展示更多outerHTML吗?要么有多个元素具有相同的xpath/css,要么元素在frame
  • 我刚刚粘贴了一个 sn-p 代码。发布整个页面源代码会更好吗?
  • 非常感谢您的宝贵时间和帮助!
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2021-12-17
  • 2018-11-07
  • 2019-06-20
相关资源
最近更新 更多