【问题标题】:Handling Rating widgets处理评分小部件
【发布时间】:2020-02-10 11:46:41
【问题描述】:

尝试为 [tripadvisor] 中的所有三个气泡评级小部件给出五颗星,如下面的屏幕截图所示,带有以下代码,但只有第一个评级小部件在 chrome 中被单击。 而在 Firefox 中,它会抛出 MoveTargetOutOfBoundsException。

new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#qid12_bubbles"))), 50, 0).click().build().perform();
Thread.sleep(10000);
new Actions(driver).moveToElement(new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#qid13_bubbles"))), 50, 0).click().build().perform();
Thread.sleep(10000);
new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#qid14_bubbles"))), 50, 0).click().build().perform();
  • 浏览器快照

【问题讨论】:

  • 您正在使用哪种编程语言..??
  • Java @HietshKumar
  • 您标识为cssSelector("#qid12_bubbles")、cssSelector("#qid13_bubbles") 和cssSelector("#qid1_bubbles") 的元素在同一运行中可能/可能不可见,因为第二项是变量。

标签: selenium firefox tripadvisor


【解决方案1】:

您使用的 ID 是动态的。请尝试使用以下 xpath。

new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[1]"))), 50, 0).click().build().perform();
new Actions(driver).moveToElement(new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[2]"))), 50, 0).click().build().perform();
new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[3]"))), 50, 0).click().build().perform();

浏览器快照。


更新:

firefox浏览器需要scroll获取element的焦点,然后执行操作。

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[1]"))));
 new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[1]"))), 50, 0).click().build().perform();
 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[2]"))));
 new Actions(driver).moveToElement(new WebDriverWait(driver, 30).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[2]"))), 50, 0).click().build().perform();
 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[3]"))));
 new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='Hotel Ratings']/following::span[3]"))), 50, 0).click().build().perform();

【讨论】:

  • 你是如何得到这些 xpath 的? @KunduK
  • 如果你去 chrome 开发工具你会找到那些 xpath。定位酒店评级标签,然后跟随跨度标签。
  • 不需要使用 Thread.sleep() 因为你已经在使用显式等待了。
  • 另一个问题是,当我在 Firefox 中运行它时,它会抛出一个名为 MoveTargetOutOfBound 的异常
  • @SaiSharan:查看我在 Firefox 上的更新答案并告诉我状态?您需要滚动元素,然后使用操作类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2021-02-19
  • 2017-12-15
  • 1970-01-01
  • 2021-10-14
  • 2011-11-29
  • 2020-11-20
相关资源
最近更新 更多