用python+selenium写脚本时遇到一个问题:find_element_by_name找不到element. 我用的是Chrome, 而用Firefox+Selenium IDE时就能正常find element.
web相关代码如下:
<input type="button" value="Log In" name="logon" οnclick="javascript:gotoLogon()" >
从代码看 find_element_by_name("logon")是绝对没有错的,而且从Selenium IDE中copy来的代码也印证了这点。难道是Selenium IDE设置的延时比较合适?我试了下
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
element = WebDriverWait(chrome, 10).until(EC.presence_of_element_located((By.NAME, "logon")))
(这是docs.seleniumhq.org的代码)
10s内网页早显示正常了,但还是没有发现element,然后我用find_element_by_xpath("//input[@='logon']")也不起作用。再试试查找同页面的其它元素,大多数找不到!奇了怪了!于是chrome中右键"view page code"看看有什么不一样的地方,竟然发现上面那段代码没有在源码中!仔细看了下原来是FRAME在作怪:
<FRAMESET BORDER=0 FRAMEBORDER=0 FRAMESPACING=0>
<FRAME SCROLLING="auto" NORESIZE NAME="mainFrame" SRC="xxxxxxx" target="_top">
</FRAMESET>
于是添加
switch_to_frame("mainFrame")解决问题。
总结:
1. Chrome右键菜单的"Inspect element"和"View page source"还是有区别呀,仔细瞧在网页存在FRAME时还会出现个"View frame source"
2. Selenium IDE中咋把switch_to_frame这句省略了呢?