我是Python和Selenium的新手,正在努力为公司网站测试表单。
我正在尝试在字段中输入文本。这是html:
<input class="form-control" data-val="true" data-val-length="Must be between 2 and 35 characters" data-val-length-max="35" data-val-length-min="2" data-val-requiredif="*First Name is required" data-val-requiredif-dependentproperty="IsMobile" data-val-requiredif-desiredvalue="False" id="FirstName-guide-request-ed9e64ebe3b245a28c9caaabbcd47b95" maxlength="35" name="FirstName" type="text" value="">
这是我尝试输入文本的代码:
driver = webdriver.Firefox(executable_path = r'C:\Users\jajacobs\Downloads\geckodriver.exe')
driver.get("https://www.graphicproducts.com/guides/5s-system/")
driver.execute_script("window.scrollTo(0, 1000);")
driver.find_element_by_name('FirstName').send_keys('test', Keys.ENTER)
driver.close()
我收到以下错误:
---------------------------------------------------------------------------
ElementNotInteractableException Traceback (most recent call last)
<ipython-input-58-6b71ac82d9ce> in <module>
10
11 timeout = 20
---> 12 driver.find_element_by_name('FirstName').send_keys('test', Keys.ENTER)
13
14 driver.close()
~\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in send_keys(self, *value)
477 self._execute(Command.SEND_KEYS_TO_ELEMENT,
478 {'text': "".join(keys_to_typing(value)),
--> 479 'value': keys_to_typing(value)})
480
481 # RenderedWebElement Items
~\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py in _execute(self, command, params)
631 params = {}
632 params['id'] = self._id
--> 633 return self._parent.execute(command, params)
634
635 def find_element(self, by=By.ID, value=None):
~\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
319 response = self.command_executor.execute(driver_command, params)
320 if response:
--> 321 self.error_handler.check_response(response)
322 response['value'] = self._unwrap_value(
323 response.get('value', None))
~\AppData\Local\Continuum\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
240 alert_text = value['alert'].get('text')
241 raise exception_class(message, screen, stacktrace, alert_text)
--> 242 raise exception_class(message, screen, stacktrace)
243
244 def _value_or_default(self, obj, key, default):
ElementNotInteractableException: Message: Element <input id="FirstName-guide-request-d277b94a662f45e686bf443012505716" class="form-control" name="FirstName" type="text"> is not reachable by keyboard
页面顶部有一个搜索框,我可以用相同的代码输入文本,但是用不同的名称进行修改。这是html:
<input id="GlobalSearchMobile" name="q" class="srch-term form-control" type="text" autocomplete="off" placeholder="Search by Keyword or SKU">
这是我用来在搜索框中输入文本的代码:
driver = webdriver.Firefox(executable_path = r'C:\Users\jajacobs\Downloads\geckodriver.exe')
driver.get("https://www.graphicproducts.com/guides/5s-system/")
driver.execute_script("window.scrollTo(0, 1000);")
driver.find_element_by_name('q').send_keys('test', Keys.ENTER)
driver.close()
因此,基本上我无法弄清楚为什么第二组代码适用于页面顶部的搜索框,而第一组代码不适用于页面中间的表单。
如果有帮助,我很乐意提供更多的html。
我正在Windows 10计算机上通过Anaconda在Jupyter Notebook启动中使用Python 3.7。
提前谢谢!
答案 0 :(得分:0)
如果您查看网页的html,则有两个元素的名称字段值为“ FirstName”。 (您可以在开发人员选项中搜索字符串'// * [@ name =“ FirstName”]'进行检查。)
因此,您可以使用类似的方法来获取所需的元素:
driver.find_elements_by_name('FirstName')[1].send_keys('test', Keys.ENTER)
在这里,find_elements..
方法将返回所有具有相同定位符的元素的列表,而不是像find_element..
方法那样从顶部开始的第一个元素,并且您要搜索的元素从顶部开始是第二个元素,因此我们用索引“ 1”索引find_elements..
的结果。
顺便说一句,我在Chrome中尝试过此操作,但它也应在Firefox上也可以使用。