我正在尝试编写一个这样工作的程序:
- 转到主页
- 单击列表中的第一项(所有项都以“item-”开头),这会将我带到下一页。
- 找到一个带有“A”的按钮并点击它。
- 找到“确认”按钮并点击它。
- 返回,同样处理第 2 项、第 3 项等。
我有两个问题。首先,上面带有“A”的按钮有时会包含比简单的“A”更多的文本,例如。 “A”与“123”脚注。我不太了解 HTML,但这会导致不同的 span 和 div 类:
<div class="selectOne">
<span class="selectObject-no-footnote">A</span>
</div>
<div class="selectOne-with-footnote">
<span class="selectObject">A</span>
<span class="selectFootnote">
<span>123</span>
</span>
</div>
它们永远不会在同一页面上,但在我的解决方案中,“A”按钮并不总是被按下。很难说是因为我的解法不对还是来自第二个问题。通常(这是随机的)当我进入带有按钮的页面时,一些横幅从页面顶部滚落,整个网站以我的“确认”按钮看不见的方式移动。我解决它的方法是每次都向下滚动网站,然后才开始寻找按钮。那么横幅是否向下滚动并不重要,因为在这两种情况下按钮“A”和“确认”都是可见的。但是,我仍然没有 100% 的准确性,而且我有时会遇到 click intercepted
异常。我的代码:
i=0
a=1
while True:
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//*[starts-with(@id, 'item-')]")))
items = driver.find_elements_by_xpath("//*[starts-with(@id, 'item-')]")
try:
items[i].click()
try:
try:
driver.execute_script("window.scrollTo(0, 250)")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH,"//span[@class='selectObject-no-footnote'][contains(text(),'A')]")))
driver.find_element_by_xpath("//span[@class='selectObject-no-footnote'][contains(text(),'A')]").click()
except Exception as e:
a = 0
print(e)
if a==0:
driver.execute_script("window.scrollTo(0, 250)")
WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='selectObject'][contains(text(),'A')]")))
driver.find_element_by_xpath("//span[@class='selectObject'][contains(text(),'A')]").click()
a=1
WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.ID, 'confirm')))
driver.find_element_by_id('confirm').click()
except Exception as e:
print(e)
i += 1
driver.back()
except IndexError:
print(items)
print(i)
break
是否有不同的工具可以做到这一点,而不必担心元素被某些东西覆盖或超出窗口? (好斗?)
最佳答案
整体逻辑是正确的。我建议进行两个更改,(这是在 JAVA 中)
1) 使用以下 xpath 查找带有文本 A 的按钮。这应该适用于两种情况(A 或 A123)
WebElement button = driver.findElement(By.xpath("//span[contains(@class,'selectObject')][contains(text(),'A')]");
button.click();
2) 您可以向下滚动到该元素并等到上面的元素在页面上可见且可点击。
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", button);
关于javascript - 带有 Selenium 的 Python : Click intercepted and finding different span classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56958779/