selenium 使用 chrome webdriver 访问具有更改 ID 的文本输入元素
Posted
技术标签:
【中文标题】selenium 使用 chrome webdriver 访问具有更改 ID 的文本输入元素【英文标题】:selenium accessing text input element with changing ID using chrome webdriver 【发布时间】:2021-12-12 05:52:01 【问题描述】:我无法从该特定网页访问输入元素。 http://prod.symx.com/MTECorp/config.asp?cmd=edit&CID=428D77C8A7ED4DA190E6170116F3A71B 如果网页已超时,请继续并单击下面的此链接 https://www.mtecorp.com/click-find/ 并单击超链接“RL_reactors”将您带到该页面。 在此页面上,我目前正在尝试访问网页的搜索栏/输入元素以输入公司销售的零件编号。这是用于学校项目并从不同公司收集数据以进行定价等。我正在使用 pycharm(python) 和 selenium 编写此脚本。目前,这是我目前代码的 sn-p
# web scraping for MTE product cost list
# reading excel files on the drive
import time
from openpyxl import workbook, load_workbook
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
.........................
..more code
..........................
#part that is getting stuck on
if((selection >= 1) and (selection <= 7)):
print("valid selection going to page...")
if(selection == 1):
target=driver.find_element(By.XPATH,"/html/body/main/article/div/div/div/table/tbody/tr[1]/td[1]/a")
driver.execute_script("arguments[0].click();", target)
element = WebDriverWait(driver,100).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".plxsty_pid"))).send_keys("test")
print("passed clickabel element agruement\n")
目前,我的代码确实会转到 RL_reactors 页面,如下所示,但是当我按类名使用 CSS 选择器时,它无法识别我想要获取的类类型。现在当然很多人会说为什么不使用 XPath 等。我不能使用 XPath 等的原因是元素 id 会随着脚本的每次迭代而改变。因此,例如,第一次运行的程序 id 名称将是“hr8”,而对于其他脚本,程序名称可能是“dsfsih”。根据我的观察,元素中唯一保持不变的部分是值和类名。我尝试过使用 XPath、id、ccselector 等,但没有结果。有什么建议 谢谢!
【问题讨论】:
我不明白你卡在哪里了。您打开页面,输入“测试”并尝试按下“验证”按钮?而您的实际问题是“如何按下验证按钮”? 【参考方案1】:因为您使用 javascript 单击您网站上的链接,selenium 不会更改选项卡(因此它无法找到您正在搜索的类)。您可以明确告诉 selenium 更改选项卡窗口。
url = "https://www.mtecorp.com/click-find/"
driver.get(url)
target=driver.find_element(By.XPATH,"/html/body/main/article/div/div/div/table/tbody/tr[1]/td[1]/a")
driver.execute_script("arguments[0].click();", target)
driver.switch_to.window(driver.window_handles[1])
element = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".plxsty_pid"))).clear()
element = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".plxsty_pid"))).send_keys('test')
或者,您可以获取 href 并通过再次调用 driver.get()
在新的 selenium 实例中打开它,而不是单击链接。
url = "https://www.mtecorp.com/click-find/"
driver.get(url)
target_link=driver.find_element(By.XPATH,"/html/body/main/article/div/div/div/table/tbody/tr[1]/td[1]/a").get_attribute('href')
driver.get(target_link)
element = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".plxsty_pid"))).clear()
element = WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".plxsty_pid"))).send_keys("test")
【讨论】:
非常感谢这解决了我的问题!我确实有一个普遍的问题。如果想打开另一个页面并查看其内容,我假设必须使用 driver.window_handles[] 是否会像打开第二个网页那样增加订单可能会成为 driver.window_handles[2]?谢谢! 使用 selenium 的内置函数 click() 打开另一个页面通常是最佳实践。那么就没有必要切换选项卡了。如果您要再次使用 javascript 打开链接,您确实需要再次切换选项卡。以上是关于selenium 使用 chrome webdriver 访问具有更改 ID 的文本输入元素的主要内容,如果未能解决你的问题,请参考以下文章