python - 如何使用 Python 和 Selenium 的另一列根据条件单击展开按钮?
问题描述
下面是我的脚本示例。我正在尝试在网站上测试“世界总计”列的每一行。如果“World Total”在此列中,那么我想单击左侧列中同一行中的可展开按钮。然后这会扩展该列,下一个“世界总计”行将低得多。即我已经改变了XPATHS,我试图弄清楚当它说世界总数时如何动态扩展行。有什么想法吗?
myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, '//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr[3]/td[4]')))
all_rows = driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr')
country = driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr/td[4]')
expand = driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr/td[3]')
for x in range(len(driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr'))):
if driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr[' + str(x) + ']/td[4]') == "World Total":
driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr[' + str(x) + ']/td[3]/input').click()
解决方案
这应该与一些小的变化一起工作 -
- 查找元素 - 返回元素的集合。因此,如果您需要查找特定元素,则必须使用 find_element 。
- text 方法返回元素中的文本。
- 使用 try & except 来处理 selenium 异常(如果找不到元素)
- X 索引默认从 0 开始。您可以根据您的 x 路径初始化为 1。
代码应该是这样的,
myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, '//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr[3]/td[4]')))
all_rows = driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr')
country = driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr/td[4]')
expand = driver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr/td[3]')
x=1
for x in range(len(all_rows )):
try:
if driver.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr[' + str(x) + ']/td[4]').text == "World Total":
driver.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_UltraWebTab1__ctl1_grdExpressQuery_GridView1"]/tbody/tr[' + str(x) + ']/td[3]/input').click()
except NoSuchElementException:
#Do something here
推荐阅读
- javascript - 通过ID而不是类获取元素时关闭模式的Javascript函数工作
- ios - OBJ-C 用 CFStringGetCStringPtr 擦除 NSString 不起作用,因为找不到正确的编码
- python - pyttsx3 无法在新安装的 Windows 10 上运行
- javascript - 停止命名函数执行自身
- java - 我有三张图像需要使用 Poi Apache 插入三张纸,但所有 3 张图像都插入到最后一张纸中
- android - 如何使用改造 2 上传包含内部 json 对象的文件?
- python - Python中的文件类型
- ssis - SSIS VS17 Unsupported:此版本的 Visual Studio 无法打开以下项目 .dtproj
- java - Spring Boot Hibernate 高效的事务管理
- laravel - laravel中条件的嵌套关系