2017-05-31 61 views
1

我正在编写一个脚本来自动使用Selenium填充某些字段。我遇到了一些问题,如果脚本点击了一个从原始URL导航的按钮,那么Python无法在新页面上找到这些元素。当浏览器发生变化时,Python Selenium无法找到元素

例如:如果我有硒,先导航到此着陆页(https://www.emedny.org),然后单击登录ePaces,然后尝试填写表单,我收到一条错误消息。这段代码是我跑:

from selenium import webdriver 

browser = webdriver.Chrome(path) 

keyed_path = r'https://www.emedny.org' 
browser.get(keyed_path) 

epaces_login = browser.find_element_by_css_selector('#targetContainer > a:nth-child(3)') 
epaces_login.click() 

username = browser.find_element_by_id('Username') 
username.send_keys('test') 

这段代码打开了https://www.emedny.org,点击一个按钮,把我们带到一个登录页面(https://www.emedny.org/epaces),并应该进入页面上的用户名。不过,我得到这个错误:

NoSuchElementException: no such element: Unable to locate element: {"method":"id","selector":"Username"} 
    (Session info: chrome=56.0.2924.87) 
    (Driver info: chromedriver=2.29.461591 (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 6.3.9600 x86_64) 

但是,如果我跳过登陆页面,并在此代码直接打开登录页面,如:

from selenium import webdriver 

browser = webdriver.Chrome(path) 

keyed_path = r'https://www.emedny.org/epaces' 
browser.get(keyed_path) 

username = browser.find_element_by_id('Username') 
username.send_keys('test') 

然后代码运行良好,并按预期更新用户名字段。看起来好像Selenium可能会在开放的网址上搜索该ID,只有

这里的用户名字段的HTML:

<input name="Username" type="text" maxlength="8" id="Username" class="inputText" size="13" onchange="javascript:validate(this)"> 

有什么建议?我试过id,XPath,css选择器,名称等。每次都有相同的错误。

编辑:硒点击首先打开一个新标签的链接。这可能是问题的一部分吗?

+0

你试图找到当前'url'使用'browser.current_url'? – TheDarkKnight

+0

反过来说,你可能需要'隐式地等待'浏览器。为进一步阅读:http://selenium-python.readthedocs.io/waits.html – TheDarkKnight

+0

@SreetamDas我没有使用current_url,因为我认为这只是一种方式来访问URL为字符串。我会尝试等待方法。谢谢 –

回答

2

我想通了。这是因为被点击的链接打开了一个新标签。 Selenium正在搜索前一个选项卡上的元素。我用window_handlesswitch_to_window这样的:

browser = webdriver.Chrome(path) 


keyed_path = r'https://www.emedny.org' 
browser.get(keyed_path) 

print(browser.window_handles) 

epaces_login = browser.find_element_by_css_selector('#targetContainer > a:nth-child(3)') 
epaces_login.click() 


browser.switch_to_window(browser.window_handles[1]) 

username = browser.find_element_by_id('Username') 

username.send_keys('test') 
+0

只是一个建议@jaredstuft,尝试使用[Selenium](http://selenium-python.readthedocs.io/);它更轻巧,而且你不会在第一个使用它时遇到新标签错误:) – TheDarkKnight

+0

@TheDarkKnight我正在使用Selenium ...你看到有什么不同吗?这是一个非常新的图书馆,所以我不确定最佳实践。 –

+0

嗯,那么如何使用[PhantomJS](https://phantomjs.org)代替Chrome驱动程序呢?这是一个“无头”驾驶员。 – TheDarkKnight

相关问题