เลื่อนองค์ประกอบเข้าสู่มุมมองด้วยซีลีเนียม


207

มีวิธีใดในซีลีเนียม 1.x หรือ 2.x เพื่อเลื่อนหน้าต่างเบราว์เซอร์เพื่อให้องค์ประกอบเฉพาะที่ระบุโดย XPath อยู่ในมุมมองของเบราว์เซอร์ มีวิธีการโฟกัสในซีลีเนียม แต่ดูเหมือนจะไม่เลื่อนภาพใน FireFox ใครบ้างมีคำแนะนำเกี่ยวกับวิธีการทำเช่นนี้?

เหตุผลที่ฉันต้องการสิ่งนี้คือฉันกำลังทดสอบการคลิกองค์ประกอบบนหน้าเว็บ น่าเสียดายที่เหตุการณ์ดูเหมือนจะไม่ทำงานจนกว่าองค์ประกอบจะปรากฏ ฉันไม่สามารถควบคุมโค้ดที่จะยิงเมื่อมีการคลิกองค์ประกอบดังนั้นฉันจึงไม่สามารถดีบักหรือทำการแก้ไขได้ดังนั้นวิธีที่ง่ายที่สุดคือการเลื่อนรายการลงในมุมมอง


คุณอาจลองแฮ็คนี้หากไม่มีสิ่งใดที่เหมาะกับคุณ : stackoverflow.com/a/53771434/7093031
YB สาเหตุ

คำตอบ:


214

ลองหลายสิ่งหลายอย่างเกี่ยวกับการเลื่อน แต่โค้ดด้านล่างให้ผลลัพธ์ที่ดีกว่า

สิ่งนี้จะเลื่อนจนกว่าองค์ประกอบจะอยู่ในมุมมอง:

WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Thread.sleep(500); 

//do anything you want with the element

6
นี่เป็นทางออกที่เรียบร้อยเมื่อคุณอาจมีองค์ประกอบposition: fixedอยู่ในหน้าของคุณและเป็นสิ่งที่คลุมเครือองค์ประกอบที่ซีลีเนียมต้องการคลิก บ่อยครั้งที่องค์ประกอบคงที่เหล่านี้อยู่ด้านล่างดังนั้นการตั้งค่าscrollIntoView(true)จะย้ายไปยังด้านบนสุดของวิวพอร์ต
Mandible79

3
ตามซีลีเนียมรุ่นใหม่ล่าสุด (2.53) ตอนนี้เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม ซีลีเนียมไม่ได้เลื่อนดูองค์ประกอบเสมอไปดังนั้นสิ่งนี้มีประโยชน์แน่นอน
Zoidberg

20
ส่งผ่านtrueไปยังscrollIntoViewหากวัตถุที่คุณกำลังเลื่อนไปอยู่ด้านล่างที่ที่คุณอยู่ในปัจจุบันfalseถ้าวัตถุที่คุณกำลังเลื่อนไปอยู่เหนือที่ที่คุณอยู่ในปัจจุบัน ฉันมีเวลาหายาก
เงินใหญ่

2
ทำไมคุณต้องนอนด้าย? executeScript ควรเป็นแบบซิงโครนัส
riccardo.tasso

1
@ riccardo.tasso อาจมีการใช้โหมดสลีปเพื่อจัดการกับแอพเป้าหมายที่ไม่รู้จัก หากมีการเลื่อนแบบไดนามิกหรือแอพพลิเคชั่นหน้าเดียวที่โหลดบิตถัดไปของหน้าหลังจากการเลื่อนรวมถึงความเป็นไปได้อื่น ๆ เมื่อพูดถึงประสบการณ์แล้วซีลีเนียมทำให้เว็บไซต์ของ บริษัท ของฉันเสียหายบ่อยครั้งเนื่องจากการกระทำอัตโนมัติที่เกิดขึ้นเร็วกว่าจาวาสคริปต์อาจทำให้เสร็จและส่งผ่านตัวแบบข้อมูลที่ไม่สมบูรณ์ บางแห่งอาจคิดว่าเป็นข้อผิดพลาด แต่ฉันถูกบอกว่า "ไม่มีมนุษย์คนใดที่สามารถเรียกสถานการณ์เช่นนี้ได้ดังนั้นจึงไม่ใช่เรื่องจริง" C'est la vie
Solonotix

157

คุณสามารถใช้org.openqa.selenium.interactions.Actionsคลาสเพื่อย้ายไปยังองค์ประกอบ

Java:

WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

งูหลาม:

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(driver.sl.find_element_by_id('my-id')).perform()

7
มันจะใช้งานได้ไหมถ้า WebElement ไม่ได้อยู่ใน View Port?
virusrocks

9
@Dominik: ซีลีเนียมจะเลื่อนเมาส์ไปยังองค์ประกอบที่อยู่นอกหน้าจอได้อย่างไร เป็นไปได้ว่ามันจะต้องเลื่อนองค์ประกอบไปสู่มุมมองก่อนจากนั้นเลื่อนเมาส์ไปที่องค์ประกอบนั้น ฉันทดสอบมัน รหัสนี้ทำงานบน Firefox Webdriver 2.48 แต่มีข้อผิดพลาด: เมื่อคุณมี iframe ในหน้าการเลื่อนไม่ทำงานอย่างถูกต้องใน iframe ในขณะที่องค์ประกอบการเลื่อนตำแหน่งบนหน้าจอ OnceScrolledIntoView อย่างถูกต้อง (แม้ว่าเอกสารจะบอกว่าคำสั่งนี้จะส่งคืนตำแหน่งเท่านั้น แต่จะเลื่อน!)
Elmue

7
เอกสารที่seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/… ตอนนี้ให้ระบุอย่างชัดเจน "เลื่อนเมาส์ไปที่กลางองค์ประกอบองค์ประกอบนั้นถูกเลื่อนลงในมุมมองและตำแหน่งของมันถูกคำนวณโดยใช้ getBoundingClientRect."
George Pantazes

5
โค้ดด้านบนคือ "วิธีการอย่างเป็นทางการ" Java Selenium ต้องการให้คุณเลื่อนองค์ประกอบลงในวิวพอร์ตอย่างไรก็ตามหลังจากลองหลายสิ่งแล้วการติดตั้ง JS ดูเหมือนจะทำงานได้อย่างน่าเชื่อถือสำหรับฉัน โดยเฉพาะวิธีนี้
Kenji Miwa

2
ไม่ได้ผลสำหรับฉัน: - | ใช้stackoverflow.com/a/23902068/661414แทน
Leukipp

28
JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("javascript:window.scrollBy(250,350)");

คุณอาจต้องการลองสิ่งนี้


1
ขอบคุณ ฉันต้องใช้วิธีนี้ในกรณีที่การเลื่อนอัตโนมัติของ Selenium ทำให้องค์ประกอบอื่นปิดบังองค์ประกอบที่ฉันต้องคลิก ฉันสามารถเลื่อนจำนวนตามอำเภอใจเพื่อให้องค์ประกอบมองเห็นได้ในวิวพอร์ตโดยไม่ถูกบดบัง
Daniel Richnak

สิ่งนี้จะทำงานใน FIrefox, Chrome และ IE ไม่รองรับวิธีนี้
virusrocks

นี่คือเหตุผลที่คุณใช้js.ExecuteScript("arguments[0].scrollIntoView(true);" + "window.scrollBy(0,-100);", e);สำหรับ IE และ Firefox และjs.ExecuteScript("arguments[0].scrollIntoViewIfNeeded(true);", e);สำหรับ Chrome ง่าย
IamBatman

((JavascriptExecutor) driver).executeScript("javascript:window.scrollBy(0,250)");สิ่งนี้ใช้ได้ใน Chrome และทางออกเดียวที่ได้ผลจริงสำหรับฉัน สถานการณ์เช่นเดียวกับผู้วิจารณ์คนแรกฉันมีองค์ประกอบคงที่ที่ด้านล่างซึ่งทำให้องค์ประกอบที่ฉันต้องการคลิกไม่ชัดเจน
เงิน


15

หากคุณต้องการเลื่อนบนหน้าต่าง Firefox โดยใช้ Selenium webdriver หนึ่งในวิธีคือการใช้ JavaScript ในโค้ด Java รหัส JavaScript เพื่อเลื่อนลง (ไปด้านล่างของหน้าเว็บ) เป็นดังนี้:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, Math.max(document.documentElement.scrollHeight, document.body.scrollHeight, document.documentElement.clientHeight));");

10

การกำหนดเป้าหมายองค์ประกอบใด ๆ และการส่งคีย์ (หรือขึ้น / ซ้าย / ขวา) ก็ใช้ได้เช่นกัน ฉันรู้ว่านี่เป็นบิตของการแฮ็ก แต่ฉันไม่ได้ใช้แนวคิดในการใช้ JavaScript เพื่อแก้ปัญหาการเลื่อนเช่นกัน

ตัวอย่างเช่น:

WebElement.sendKeys(Keys.DOWN);

นี่ไม่ใช่การแฮ็กน้อยกว่าการใช้ js และมันก็เป็นสิ่งที่ง่ายที่สุด ฉันพบว่านี่เป็นปัญหาหลักสำหรับ IE ที่การคลิกพยายามเลื่อนองค์ประกอบไปยังมุมมอง แต่ไม่ได้ทำให้ การแก้ปัญหานั้นดูดีมากเมื่อใช้ {PGUP} ถ้าทำด้วยสถานการณ์ลอง / catch / loop
jibbs

คุณบันทึกวันของฉัน! ขอบคุณ
Jesko R.

ในกรณีที่หน้าลงของฉันคือสิ่งที่ทำงาน นี่เป็นแฮ็คที่ดี (เทียบกับแฮ็คทั้งหมด js)
akostadinov

ขอบคุณ @DevDave! เทียบเท่าใน C #:var elem = driver.FindElement(By.Id("element_id")); elem.SendKeys(Keys.PageDown);
Watth

9
webElement = driver.findElement(By.xpath("bla-bla-bla"));
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", webElement);

สำหรับตัวอย่างเพิ่มเติมไปที่นี่ ทั้งหมดในภาษารัสเซีย แต่รหัส Java เป็นข้ามวัฒนธรรม :)


ฉันจะเข้าใจได้ไหมว่าทำไมถึงมี -1 สำหรับการแก้ปัญหานี้?
josephnvu

เพราะมันใช้งานได้เฉพาะใน Firefox ไม่มีเบราว์เซอร์อื่นที่รองรับวิธีนี้
Wayne Allen

หากมีคนต้องการคำแปลจากรัสเซียสำหรับเอกสารดังกล่าวข้างต้นยินดีที่จะช่วย
monkrus

8

ในซีลีเนียมเราจำเป็นต้องได้รับความช่วยเหลือจากผู้ดำเนินการจาวาสคริปต์เพื่อเลื่อนไปยังองค์ประกอบหรือเลื่อนหน้า:

je.executeScript("arguments[0].scrollIntoView(true);", element);

ในข้อความข้างต้นelementเป็นองค์ประกอบที่แน่นอนที่เราต้องเลื่อน ฉันลองใช้รหัสด้านบนและได้ผลกับฉัน

ฉันมีโพสต์และวิดีโอที่สมบูรณ์เกี่ยวกับเรื่องนี้:

http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/


@Mukesh otwani โค้ดด้านบนจะเลื่อนลง แต่วิธีการที่ abt เลื่อนขึ้นโดยไม่ใช้พิกเซลที่กำหนดไว้
khan

6

คุณสามารถใช้ข้อมูลโค้ดนี้เพื่อเลื่อน:

ค#

var element = Driver.FindElement(By.Id("element-id"));
Actions actions = new Actions(Driver);
actions.MoveToElement(element).Perform();

ที่นั่นคุณมีมัน


6

สิ่งนี้ใช้ได้กับฉัน:

IWebElement element = driver.FindElements(getApplicationObject(currentObjectName, currentObjectType, currentObjectUniqueId))[0];
 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", element);

5

ซีลีเนียม 2 พยายามเลื่อนไปที่องค์ประกอบแล้วคลิกที่มัน นี่เป็นเพราะซีลีเนียม 2 จะไม่โต้ตอบกับองค์ประกอบเว้นแต่ว่ามันจะมองเห็นได้

การเลื่อนไปที่องค์ประกอบเกิดขึ้นโดยปริยายดังนั้นคุณเพียงแค่ต้องค้นหารายการแล้วทำงานกับมัน


19
นี่เป็นคำตอบของคำถามได้อย่างไร
reinierpost

57
ดูเหมือนจะไม่ได้ทำงานอย่างนั้นสำหรับฉัน ฉันได้รับข้อผิดพลาด 'องค์ประกอบที่ไม่สามารถคลิกได้' สำหรับองค์ประกอบที่ไม่อยู่ในมุมมอง
DevDave

5
@DevDave ฉันมีปัญหาเดียวกันยกเว้นในกรณีของฉันซีลีเนียมไม่ได้ทำการคลิกในองค์ประกอบและไม่มีข้อยกเว้น ฉันไม่เคยมีปัญหามาก่อนและไม่รู้ว่าอะไรทำให้เกิดสิ่งนั้น
Zeinab Abbasimazar

5
การเลื่อนโดยนัยแตกต่างกันไประหว่างเบราว์เซอร์ ฉันมีการทดสอบองค์ประกอบในเมนูป๊อปอัปที่อยู่กึ่งกลางหน้ากระดาษ ด้วย Ruby gem selenium_webdriver 2.43 ฉันพบ Chromium-browser 37 (และฉันเชื่อว่า Internet Explorer) จะเลื่อนรายการเมนูลงในมุมมองและคลิก แต่ดูเหมือนว่า Firefox 32 จะไม่เลื่อนเลยและล้มเหลวด้วย "องค์ประกอบไม่สามารถมองเห็นได้ในขณะนี้และอาจไม่สามารถโต้ตอบได้"
skierpage

9
คำตอบนี้ผิด ตามข้อกำหนดสำหรับ Selenium 2.0 WebElement.click()ต้องการองค์ประกอบที่จะมองเห็นได้เพื่อที่จะคลิกที่มัน มันจะไม่เลื่อนในนามของคุณ
Gili

5

ใช้ไดรเวอร์เพื่อส่งคีย์เช่นpagedownหรือdownarrowปุ่มเพื่อนำองค์ประกอบเข้ามาดู ฉันรู้ว่ามันง่ายเกินไปวิธีแก้ปัญหาและอาจไม่สามารถใช้ได้ในทุกกรณี


1
นี่เป็นเรื่องไร้สาระ คุณอาจต้องส่งโหลหน้าลงบนหน้าใหญ่ มันช้าและไม่น่าเชื่อถือ
Elmue

2
ใช่. ฉันเห็นด้วย. แต่ฉันพูดว่า "ไม่สามารถใช้ได้ในทุกกรณี"
Ganesh S

การค้นหาสิ่งที่รู้จักelementในหน้าเว็บที่สามารถดูได้และการส่ง PageDown นั้นelement.SendKeys(Keys.PageDown);เหมาะกับฉัน
Gokul

ฉันแนะนำให้ใช้ปุ่ม Alt เพื่อไม่ให้เลื่อนหน้าและใช้ข้อลอง / ยกเว้น (Python) เพื่อจัดการข้อผิดพลาดที่อาจเกิดขึ้นขณะพยายามส่งคีย์ไปยังองค์ประกอบบางอย่าง
Alex K.

4

จากประสบการณ์ของฉัน Selenium Webdriver ไม่ได้เลื่อนไปที่องค์ประกอบเมื่อคลิกโดยอัตโนมัติเมื่อมีส่วนที่เลื่อนได้มากกว่าหนึ่งส่วนในหน้า (ซึ่งค่อนข้างบ่อย)

ฉันใช้ Ruby และสำหรับ AUT ของฉันฉันต้องติดตั้งวิธีการคลิกดังนี้

class Element

      #
      # Alias the original click method to use later on
      #
      alias_method :base_click, :click

      # Override the base click method to scroll into view if the element is not visible
      # and then retry click
      #
      def click
        begin
          base_click
        rescue Selenium::WebDriver::Error::ElementNotVisibleError
          location_once_scrolled_into_view
          base_click
        end
      end

กระบวนการ 'location_once_scrolled_into_view' เป็นวิธีการที่มีอยู่ในคลาส WebElement

ฉันขอโทษคุณอาจไม่ได้ใช้ทับทิม แต่ควรให้แนวคิดบางอย่างกับคุณ


ผมประกาศไว้ในข้างต้นmodule Capybara :: module Nodeและฉันต้องการที่จะเรียกแทนเพียงnative.location_once_scrolled_into_view location_once_scrolled_into_viewฉันได้รับการช่วยเหลือ::Selenium::WebDriver::Error::UnknownErrorด้วยซึ่งเป็นสิ่งที่ฉันได้รับบ่อยใน Firefox 44.0.2 แต่ฉันพบว่าวิธีนี้ไม่ยืดหยุ่นพอและวาง<Element>.native.location_once_scrolled_into_viewสายในการทดสอบการยอมรับตัวเองตามมาทันทีpage.execute_script('window.scrollByPages(-1)')ที่ต้องการ
Al Chou

Watir มีวิธีการที่ได้รับมอบหมายให้ซีลีเนียมของElement#scroll_into_view location_once_scrolled_into_viewแต่ทั้งคู่ไม่ได้ทำอะไรที่แตกต่างไปจากพฤติกรรมเริ่มต้นของซีลีเนียมดังนั้นองค์ประกอบที่ล้นก็ยังสามารถขัดขวางสิ่งที่เราพยายามคลิก
akostadinov

3

สคริปต์ Ruby สำหรับการเลื่อนองค์ประกอบไปยังมุมมองมีดังนี้

$driver.execute_script("arguments[0].scrollIntoView(true);", element)
sleep(3)
element.click

2

บางครั้งฉันก็ประสบปัญหาการเลื่อนด้วยซีลีเนียม ดังนั้นฉันจึงใช้ javaScriptExecuter เพื่อให้ได้สิ่งนี้

สำหรับการเลื่อนลง:

WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollBy(0, 250)", "");

หรือยัง

js.executeScript("scroll(0, 250);");

สำหรับการเลื่อนขึ้น:

js.executeScript("window.scrollBy(0,-250)", "");

หรือ,

js.executeScript("scroll(0, -250);");

2

หากคุณคิดว่าคำตอบอื่น ๆ แฮ็คเกินไปคำตอบนี้ก็เช่นกัน แต่ไม่มีการฉีด JavaScript ที่เกี่ยวข้อง

เมื่อปุ่มปิดหน้าจอมันจะแตกและเลื่อนไปที่มันดังนั้นลองใหม่อีกครั้ง ... ¯ \ _ (ツ) _ / ¯

try
{
    element.Click();
}
catch {
    element.Click();
}

2

นี่เป็นวิธีการแก้ปัญหาซ้ำกับ JavaScript แต่มีองค์ประกอบรอเพิ่ม

มิฉะนั้นElementNotVisibleExceptionอาจปรากฏขึ้นหากมีการกระทำบางอย่างกับองค์ประกอบ

this.executeJavaScriptFunction("arguments[0].scrollIntoView(true);", elementToBeViewable);
WebDriverWait wait = new WebDriverWait(getDriver(), 5);
wait.until(ExpectedConditions.visibilityOf(elementToBeViewable));

?? <- หมายถึงอะไร
Choi

1

ฉันใช้วิธีนี้เพื่อเลื่อนองค์ประกอบแล้วคลิก:

List<WebElement> image = state.getDriver().findElements(By.xpath("//*[contains(@src,'image/plus_btn.jpg')]"));

for (WebElement clickimg : image)
{
  ((JavascriptExecutor) state.getDriver()).executeScript("arguments[0].scrollIntoView(false);", clickimg);
  clickimg.click();
}

ในกรณีของฉันscrollIntoView(false)ทำงานได้ แต่scrollIntoView(true)ไม่ได้ สามารถใช้งานได้ขึ้นอยู่กับสถานการณ์ของคุณ
rsenna

กรณีของฉันคือสิ่งที่ตรงกันข้าม - งานจริงงานล้มเหลวล้มเหลว แต่เท่าที่การคลิกดำเนินไป มันเลื่อนอย่างถูกต้องสำหรับเท็จและเป็นสิ่งที่ฉันต้องการ แต่ด้วยเหตุผลใดก็ตามซีลีเนียมยังไม่สามารถมองเห็นได้สำหรับการคลิก การใช้ scrolls จริงทุกอย่างสูงเกินไป แต่อย่างน้อยก็ใช้งานได้
Bill Hileman

sendkey ของผู้ใช้ป้อนแทนการคลิกเมื่อทำได้ - หลีกเลี่ยงปัญหาหากเบราว์เซอร์ไม่ได้ซูม 100%
Zunair

1
def scrollToElement(element: WebElement) = {
  val location = element.getLocation
  driver.asInstanceOf[JavascriptExecutor].executeScript(s"window.scrollTo(${location.getX},${location.getY});")
}

1

คุณอาจต้องการเยี่ยมชมหน้าเลื่อนองค์ประกอบของเว็บและหน้าเว็บ - Selenium WebDriver โดยใช้ Javascript :

public static void main(String[] args) throws Exception {

    // TODO Auto-generated method stub
    FirefoxDriver ff = new FirefoxDriver();
    ff.get("http://toolsqa.com");
    Thread.sleep(5000);
    ff.executeScript("document.getElementById('text-8').scrollIntoView(true);");
}

@AbhishekBedi ฉันจำได้ว่ามันรองรับ Chrome ด้วย คุณอาจประสบปัญหาเฉพาะใดบ้าง
virusrocks

1

ในสถานการณ์ส่วนใหญ่สำหรับการเลื่อนรหัสนี้จะทำงาน

WebElement element = driver.findElement(By.xpath("xpath_Of_Element"));                 
js.executeScript("arguments[0].click();",element);

1

JAVA

ลองเลื่อนไปที่องค์ประกอบใช้x yตำแหน่งและใช้JavascriptExecutorกับอาร์กิวเมนต์นี้:"window.scrollBy(x, y)"กับนี้คืออาร์กิวเมนต์:

นำเข้าดังต่อไปนี้:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.JavascriptExecutor;

ก่อนอื่นคุณต้องรับx yตำแหน่งขององค์ประกอบ

//initialize element
WebElement element = driver.findElement(By.id("..."));

//get position
int x = element.getLocation().getX();
int y = element.getLocation().getY();

//scroll to x y 
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(" +x +", " +y +")");

1

ฉันไม่แน่ใจว่าคำถามนี้ยังเกี่ยวข้องอยู่หรือไม่ แต่หลังจากอ้างถึงเอกสาร scrollIntoView จากhttps://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView

ทางออกที่ง่ายที่สุดก็คือ

executor.executeScript("arguments[0].scrollIntoView({block: \"center\",inline: \"center\",behavior: \"smooth\"});",element);

สิ่งนี้จะเลื่อนองค์ประกอบเข้าสู่กึ่งกลางของหน้า


0

พฤติกรรมเริ่มต้นของ Selenium ให้เราเลื่อนเพื่อให้องค์ประกอบอยู่ในมุมมองแทบที่ด้านบนของวิวพอร์ต นอกจากนี้เบราว์เซอร์บางตัวเท่านั้นที่มีพฤติกรรมเหมือนกันทุกประการ นี่คือความพึงพอใจมาก หากคุณบันทึกวิดีโอของการทดสอบเบราว์เซอร์เช่นเดียวกับสิ่งที่คุณต้องการสำหรับองค์ประกอบที่จะเลื่อนดูและอยู่กึ่งกลางแนวตั้งที่จะเลื่อนลงในมุมมองและเป็นศูนย์กลางในแนวตั้ง

นี่คือทางออกของฉันสำหรับ Java:

public List<String> getBoundedRectangleOfElement(WebElement we)
{
    JavascriptExecutor je = (JavascriptExecutor) driver;
    List<String> bounds = (ArrayList<String>) je.executeScript(
            "var rect = arguments[0].getBoundingClientRect();" +
                    "return [ '' + parseInt(rect.left), '' + parseInt(rect.top), '' + parseInt(rect.width), '' + parseInt(rect.height) ]", we);
    System.out.println("top: " + bounds.get(1));
    return bounds;
}

จากนั้นเมื่อต้องการเลื่อนคุณเรียกมันว่า:

public void scrollToElementAndCenterVertically(WebElement we)
{
    List<String> bounds = getBoundedRectangleOfElement(we);
    Long totalInnerPageHeight = getViewPortHeight(driver);
    JavascriptExecutor je = (JavascriptExecutor) driver;
    je.executeScript("window.scrollTo(0, " + (Integer.parseInt(bounds.get(1)) - (totalInnerPageHeight/2)) + ");");
    je.executeScript("arguments[0].style.outline = \"thick solid #0000FF\";", we);
}

ฟังก์ชั่น getViewPortHeight ขาดหายไป ... ในสมมติฐานที่ว่าคุณได้รับความสูงขององค์ประกอบเป้าหมาย
Shubham Jain

0

นี่คือวิธีที่ฉันทำกับ PHP webDriver สำหรับ Selenium ใช้งานได้กับเซิร์ฟเวอร์ Selenium สแตนด์อะโลน 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0

$element=$session->welement("xpath", "//input[@value='my val']");
$element->click();
$element=$session->welement("xpath", "//input[@value='ma val2']");
$element->location_in_view(); // < -- this is the candy
$element->click();

หมายเหตุ: ฉันใช้ Element34 PHP-webdriver เวอร์ชันที่กำหนดเอง แต่ไม่มีการเปลี่ยนแปลงใด ๆ ในแกนกลาง ฉันแค่ใช้ "องค์ประกอบ" แทน "องค์ประกอบ" แต่มันก็ไม่ได้ส่งผลกระทบต่อคดีนี้ ผู้เขียนไดรเวอร์บอกว่า "เพื่ออนุญาตให้การเรียก API เกือบทั้งหมดเป็นการแปลงโดยตรงของสิ่งที่กำหนดไว้ในโปรโตคอล WebDriver เอง" ดังนั้นคุณไม่ควรมีปัญหากับภาษาโปรแกรมอื่น

เพียงคลิกจะไม่ทำงานในการตั้งค่าของฉัน มันจะทำการเลื่อนแทนการคลิกดังนั้นฉันต้องคลิกสองครั้งโดยไม่เรียก "location_in_view ()"

หมายเหตุ: วิธีนี้ใช้ได้กับองค์ประกอบที่สามารถดูได้เช่นปุ่มอินพุตชนิด

ดูที่: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location

คำอธิบายสำหรับ JsonWireProtocol # แนะนำการใช้ location + moveto เนื่องจาก location _in_view เป็นวิธีการภายใน


0

สิ่งที่ใช้งานได้สำหรับฉันคือการใช้วิธี Browser.MoveMouseToElement ในองค์ประกอบที่ด้านล่างของหน้าต่างเบราว์เซอร์ ทำงานได้อย่างมหัศจรรย์ใน Internet Explorer, Firefox และ Chrome

ฉันเลือกสิ่งนี้มากกว่าเทคนิคการฉีด JavaScript เพียงเพราะรู้สึกว่าแฮ็คน้อย


ภาษาโปรแกรมนี้คืออะไร?
akostadinov

0

ฉันทำการทดสอบกับส่วนประกอบ ADF และคุณต้องมีคำสั่งแยกต่างหากสำหรับการเลื่อนถ้าใช้การโหลดแบบขี้เกียจ หากไม่ได้โหลดวัตถุและคุณพยายามค้นหาโดยใช้ซีลีเนียมซีลีเนียมจะโยนข้อยกเว้นที่ไม่พบองค์ประกอบ


0

หากไม่มีอะไรใช้งานได้ลองก่อนคลิก:

public void mouseHoverJScript(WebElement HoverElement) {

    String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}";
    ((JavascriptExecutor) driver).executeScript(mouseOverScript, HoverElement);
}

0

ใน Java เราสามารถเลื่อนโดยใช้ JavaScript เช่นในรหัสต่อไปนี้:

driver.getEval("var elm = window.document.getElementById('scrollDiv'); if (elm.scrollHeight > elm.clientHeight){elm.scrollTop = elm.scrollHeight;}");

คุณสามารถกำหนดค่าที่ต้องการให้กับตัวแปร "elm.scrollTop"


0

ทางออกคือ:

public void javascriptclick(String element)
{
    WebElement webElement = driver.findElement(By.xpath(element));
    JavascriptExecutor js = (JavascriptExecutor) driver;

    js.executeScript("arguments[0].click();", webElement);
    System.out.println("javascriptclick" + " " + element);
}

0

รหัสนี้ใช้งานได้สำหรับฉัน:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250, 350)");

ได้ผลสำหรับฉัน การนำ Dart WebDriver ไปใช้ยังไม่มีการกระทำ
GünterZöchbauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.