如何将密钥发送到硒中没有 ID 和/或名称的表单 (Python)
How to send keys to a form with no id and or name in selenium (Python)
我正在努力从网站获取数据,每当我点击 link 获取 phone 号码时,都会打开一个模态表单以询问我的 phone 号码首先,phone 号码显示给我。
我现在面临的挑战是,我想将密钥发送到输入字段,因为输入字段没有名称或 ID,所以我使用 xpath 找到了输入字段:
xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")
我打印了这个,它返回了一些 selenium 对象,但是当我尝试发送像这样的键时:
xxx.send_keys('08100000000')
这是 html 代码的片段:
<div class="row">
<div class="medium-12 columns">
<div class="guest-text">
One step closer! <br />
<span>Please provide your contact number to view business contact details</span>
</div>
<form action="" data-abide="ajax" novalidate="novalidate">
<div id="txtUserPhoneNumber" ng-show="!isLoggedIn && collectUserPhone == ''" class="guest-no">
<label>
<div class="guest-label">Phone Number</div>
<input type="text" placeholder="081xxxxxxxx" ng-model="UserPhoneNew" required data-invalid="" aria-invalid="true" maxlength="11">
</label>
</div>
</form>
</div>
我试过:
xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")
xxx.send_keys('08100000000')
dummy_number = driver.find_element_by_xpath("//div[contains(@class, 'modal small guest')]/div[contains(@class, 'guest-modal-wrapper')]//form[1]//input[1]")
dummy_number.send_keys('081000000')
我收到错误提示:
Traceback (most recent call last):
File "Dropbox/automation/vconnect.py", line 76, in <module>
RunAutomation.instantiatechrome()
File "Dropbox/automation/vconnect.py", line 61, in instantiatechrome
xxx.send_keys('081xxxxxxxx')
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
'value': keys_to_typing(value)})
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
return self._parent.execute(command, params)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: chrome=66.0.3359.139)
(Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.13.0-39-generic x86_64)
欢迎您提出意见。
错误消息说该元素不可见。所以你必须明确地等到它变得可见。使用 ExpectedCondition as described here.
最终您的代码可能如下所示(最多等待 120 秒):
from selenium.webdriver.support import expected_conditions as EC
...
wait = WebDriverWait(driver, 120)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@placeholder='081xxxxxxxx']")))
element.send_keys('08100000000')
关于错误,您需要等待元素显示并启用交互。您可以通过阅读“Selenium 中的隐式和显式等待”来了解它。
在这里你可以找到一些额外的信息:
还有一个额外的小费。
通常我们使用XPath只是当一个元素很难找到,甚至无法通过ID或CssSelector找到时。这是因为 XPath 不像 CssSelector 一样常见,并且根据它的编写方式更难理解。
当我们需要使用 XPath 或 CssSelector 查找某个元素时,首先我们需要检查哪些值在与页面交互后不会改变,以及哪些为我们提供了唯一值(当我们只需要一个元素,ofc)。
因为你的html只有一个id为txtUserPhoneNumber
的元素,而你想要的元素就在其中,让我们开始选择它。之后,查看所需元素的标签名称。里面只有一个input
元素?好的!所以我们可以只使用这几个信息到达元素。
CssSelector:
#txtUserPhoneNumber input
和
Xpath:
//*[@id='txtUserPhoneNumber ']//input
这个错误信息...
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
...表示您采用的 Locator Strategy 未在网页上识别任何 unique WebElement。
但是存在一些问题,包括您使用的二进制文件之间的版本兼容性,如下所示:
- 您正在使用 chromedriver=2.35
- chromedriver=2.35 的发行说明清楚地提到了以下内容:
Supports Chrome v62-64
- 您正在使用 chrome=66.0
- ChromeDriver v2.38 的发行说明清楚地提到了以下内容:
Supports Chrome v65-67
所以 ChromeDriver 版本 (v2.35) 和 Chrome 浏览器 版本 (v66.0)
解决方案
- 将 Selenium 升级到当前级别 Version 3.11.0。
- 将Chrome驱动程序升级到当前ChromeDriver v2.38级别。
- 将 Chrome 版本保持在 Chrome v66.x 级别。 (as per ChromeDriver v2.38 release notes)
- 清理你的项目工作区通过你的IDE和重建你的项目只需要依赖。
- 使用 CCleaner 工具清除执行 测试套件 .
前后的所有 OS 琐事
- 如果您的基础 Web 客户端 版本太旧,则通过 Revo Uninstaller 卸载它并安装最新的 GA 和发布版本的 Web 客户端.
- 系统重启。
如您所见,ElementNotVisibleException 您需要为 WebElement[= 引入 WebDriverWait 83=] 可点击如下:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# other code
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//form[@data-abide='ajax']//input[@ng-model='UserPhoneNew']"))).send_keys("08100000000")
执行你的@Test
.
注意 : 在这里你会找到关于
的详细讨论
我正在努力从网站获取数据,每当我点击 link 获取 phone 号码时,都会打开一个模态表单以询问我的 phone 号码首先,phone 号码显示给我。
我现在面临的挑战是,我想将密钥发送到输入字段,因为输入字段没有名称或 ID,所以我使用 xpath 找到了输入字段:
xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")
我打印了这个,它返回了一些 selenium 对象,但是当我尝试发送像这样的键时:
xxx.send_keys('08100000000')
这是 html 代码的片段:
<div class="row">
<div class="medium-12 columns">
<div class="guest-text">
One step closer! <br />
<span>Please provide your contact number to view business contact details</span>
</div>
<form action="" data-abide="ajax" novalidate="novalidate">
<div id="txtUserPhoneNumber" ng-show="!isLoggedIn && collectUserPhone == ''" class="guest-no">
<label>
<div class="guest-label">Phone Number</div>
<input type="text" placeholder="081xxxxxxxx" ng-model="UserPhoneNew" required data-invalid="" aria-invalid="true" maxlength="11">
</label>
</div>
</form>
</div>
我试过:
xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")
xxx.send_keys('08100000000')
dummy_number = driver.find_element_by_xpath("//div[contains(@class, 'modal small guest')]/div[contains(@class, 'guest-modal-wrapper')]//form[1]//input[1]")
dummy_number.send_keys('081000000')
我收到错误提示:
Traceback (most recent call last):
File "Dropbox/automation/vconnect.py", line 76, in <module>
RunAutomation.instantiatechrome()
File "Dropbox/automation/vconnect.py", line 61, in instantiatechrome
xxx.send_keys('081xxxxxxxx')
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
'value': keys_to_typing(value)})
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
return self._parent.execute(command, params)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: chrome=66.0.3359.139)
(Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.13.0-39-generic x86_64)
欢迎您提出意见。
错误消息说该元素不可见。所以你必须明确地等到它变得可见。使用 ExpectedCondition as described here.
最终您的代码可能如下所示(最多等待 120 秒):
from selenium.webdriver.support import expected_conditions as EC
...
wait = WebDriverWait(driver, 120)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@placeholder='081xxxxxxxx']")))
element.send_keys('08100000000')
关于错误,您需要等待元素显示并启用交互。您可以通过阅读“Selenium 中的隐式和显式等待”来了解它。
在这里你可以找到一些额外的信息:
还有一个额外的小费。
通常我们使用XPath只是当一个元素很难找到,甚至无法通过ID或CssSelector找到时。这是因为 XPath 不像 CssSelector 一样常见,并且根据它的编写方式更难理解。
当我们需要使用 XPath 或 CssSelector 查找某个元素时,首先我们需要检查哪些值在与页面交互后不会改变,以及哪些为我们提供了唯一值(当我们只需要一个元素,ofc)。
因为你的html只有一个id为txtUserPhoneNumber
的元素,而你想要的元素就在其中,让我们开始选择它。之后,查看所需元素的标签名称。里面只有一个input
元素?好的!所以我们可以只使用这几个信息到达元素。
CssSelector:
#txtUserPhoneNumber input
和
Xpath:
//*[@id='txtUserPhoneNumber ']//input
这个错误信息...
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
...表示您采用的 Locator Strategy 未在网页上识别任何 unique WebElement。
但是存在一些问题,包括您使用的二进制文件之间的版本兼容性,如下所示:
- 您正在使用 chromedriver=2.35
- chromedriver=2.35 的发行说明清楚地提到了以下内容:
Supports Chrome v62-64
- 您正在使用 chrome=66.0
- ChromeDriver v2.38 的发行说明清楚地提到了以下内容:
Supports Chrome v65-67
所以 ChromeDriver 版本 (v2.35) 和 Chrome 浏览器 版本 (v66.0)
解决方案
- 将 Selenium 升级到当前级别 Version 3.11.0。
- 将Chrome驱动程序升级到当前ChromeDriver v2.38级别。
- 将 Chrome 版本保持在 Chrome v66.x 级别。 (as per ChromeDriver v2.38 release notes)
- 清理你的项目工作区通过你的IDE和重建你的项目只需要依赖。
- 使用 CCleaner 工具清除执行 测试套件 . 前后的所有 OS 琐事
- 如果您的基础 Web 客户端 版本太旧,则通过 Revo Uninstaller 卸载它并安装最新的 GA 和发布版本的 Web 客户端.
- 系统重启。
如您所见,ElementNotVisibleException 您需要为 WebElement[= 引入 WebDriverWait 83=] 可点击如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # other code WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//form[@data-abide='ajax']//input[@ng-model='UserPhoneNew']"))).send_keys("08100000000")
执行你的
@Test
.
注意 : 在这里你会找到关于