selenium 使用 chrome webdriver 访问具有更改 ID 的文本输入元素

selenium accessing text input element with changing ID using chrome webdriver

我无法从此特定网页访问输入元素。 http://prod.symx.com/MTECorp/config.asp?cmd=edit&CID=428D77C8A7ED4DA190E6170116F3A71B 如果网页已超时,请继续并单击下面的此 clink https://www.mtecorp.com/click-find/ 然后单击超链接“RL_reactors”将您带到该页面。 在此页面上,我目前正在尝试访问网页的搜索栏/输入元素以输入公司销售的零件号。这是用于学校项目和从不同公司收集数据以进行定价等。我正在使用 pycharm(python) 和 selenium 来编写此脚本。目前,这是我目前的代码片段

# 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 选择器 class 名称时,它无法识别 class 我想要得到的类型。现在当然很多人会说为什么不使用 XPath 等。我不能使用 XPath 等的原因是元素 id 在脚本的每次迭代中都会发生变化。因此,例如,程序 ID 名称的第一个 运行 将是“hr8”,而对于其他脚本,程序名称可能是“dsfsih”。根据我的观察,元素唯一保持不变的部分是值和 class 名称。我尝试过使用 XPath、id、ccselector 等,但没有结果。有什么建议么 谢谢!

因为您正在使用 javascript 单击您网站上的 link,selenium 不会更改选项卡(因此它无法找到您正在搜索的 class)。您可以明确告诉 selenium 更改选项卡 window.

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')

或者,您可以通过再次调用 driver.get() 获取 href 并在新的 selenium 实例中将其打开,而不是单击 link。

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")