Chúng ta hãy xem xét một vài cách khác nhau để thực thi các câu lệnh JavaScript thông qua Python Selenium WebDriver
qua
Arunkumar Velusamy
·Tháng 12. 13, 18 · Hướng dẫnThích
Nhận xét
Tiết kiệm
tiếng riu ríu
168. 39K Lượt xem
Tham gia cộng đồng DZone và có được trải nghiệm thành viên đầy đủ
Tham gia miễn phíTrong hướng dẫn này, hãy phân tích tính năng ít được sử dụng nhất nhưng lại mạnh mẽ nhất của Selenium WebDriver. Vâng, tôi sẽ thảo luận về trình thực thi JavaScript và chỉ cho bạn một số cách khác nhau để thực thi các câu lệnh JavaScript thông qua Python Selenium WebDriver
Có thể xảy ra trường hợp trong một số dự án thời gian thực, Selenium WebDriver không thể thực hiện tác vụ trên một phần tử web cụ thể. Ví dụ: vì WebDriver mô phỏng tương tác của người dùng cuối nên đương nhiên là nó sẽ từ chối nhấp vào phần tử mà người dùng cuối không nhìn thấy [đôi khi điều này cũng xảy ra ngay cả khi phần tử web hiển thị trên trang]. Có thể có một số lý do hoặc tình huống tương tự khác
Trong những trường hợp này, chúng tôi có thể dựa vào JavaScript để nhấp hoặc thực hiện các hành động trên phần tử web đó và các câu lệnh JavaScript này có thể được thực thi thông qua WebDriver
Bạn có thể làm mọi thứ mà giao diện WebElement làm và hơn thế nữa với JavaScript
JavaScript là gì?
JavaScript là ngôn ngữ kịch bản chạy ở phía máy khách, tôi. e, trên trình duyệt và thực hiện một số điều kỳ diệu khi bạn lướt qua các trang web. Để biết thêm chi tiết, hãy tìm kiếm từ khóa "JavaScript" trên DZone
Chúng tôi sử dụng JavaScript trong WebDriver như thế nào?
Python Selenium WebDriver cung cấp một phương thức tích hợp sẵn
driver.execute_script["some javascript code here"];
Có hai cách chúng ta có thể thực thi JavaScript trong trình duyệt
Phương pháp 1. Thực thi JavaScript ở cấp gốc tài liệu
Trong trường hợp này, chúng tôi nắm bắt phần tử mà chúng tôi muốn làm việc bằng cách sử dụng các phương thức do JavaScript cung cấp, sau đó khai báo một số hành động trên phần tử đó và thực thi JavaScript này bằng WebDriver
Thí dụ
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
Chúng tôi đang làm gì ở đây?
Bước 1. Chúng tôi đang kiểm tra và tìm nạp phần tử theo 'tên' thuộc tính bằng JavaScript. [Ngoài ra, các thuộc tính 'id' và 'class' có thể được sử dụng. ]
Bước 2. Khai báo và thực hiện hành động nhấp chuột trên một phần tử bằng JavaScript
Bước 3. Gọi phương thức exec_script[] và truyền JavaScript mà chúng ta đã tạo dưới dạng giá trị chuỗi
Thông báo
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
3 trong câu javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
4 ở trên. Các hàm JavaScript javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
5 , javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
6 , v.v. trả về tất cả các phần tử phù hợp như . Trong trường hợp của chúng tôi, chúng tôi cần hành động trên phần tử phù hợp đầu tiên có thể được truy cập thông qua javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
7 . Nếu bạn biết những gì bạn đang làm, tôi. e. , nếu bạn biết chỉ mục của phần tử bạn muốn thao tác, bạn có thể trực tiếp sử dụng chỉ mục, chẳng hạn như javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
8 . Tuy nhiên, nếu bạn đang sử dụng hàm JavaScript '
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
9 ', thì bạn không cần sử dụng bất kỳ chỉ mục nào vì nó sẽ chỉ trả về . Trong khi thực thi, WebDriver sẽ đưa câu lệnh JavaScript vào trình duyệt và tập lệnh sẽ thực hiện công việc. Trong ví dụ của chúng tôi, nó thực hiện thao tác nhấp chuột trên phần tử đích. JavaScript này có không gian tên riêng và không can thiệp vào JavaScript trong trang web thực tế
Phương pháp 2. Thực thi JavaScript ở cấp phần tử
Trong trường hợp này, chúng tôi nắm bắt phần tử mà chúng tôi muốn làm việc bằng cách sử dụng WebDriver, sau đó chúng tôi khai báo một số hành động trên phần tử đó bằng JavaScript và thực thi JavaScript này bằng cách sử dụng WebDriver bằng cách chuyển phần tử web làm đối số cho JavaScript
Điều này có khó hiểu không?
Ví dụ
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
Chúng tôi đang làm gì ở đây?
Bước 1. Kiểm tra và nắm bắt phần tử bằng các phương thức do WebDriver cung cấp như '
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
0 '. javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
1Bước 2. Khai báo và thực hiện hành động nhấp chuột trên phần tử bằng JavaScript
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
2Bước 3. Gọi phương thức
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
1 với câu lệnh JavaScript mà chúng ta đã tạo dưới dạng giá trị chuỗi và phần tử web được ghi lại bằng cách sử dụng WebDriver làm đối số. javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
4Hai dòng mã trên có thể được rút ngắn thành định dạng bên dưới, nơi chúng tôi tìm thấy một phần tử bằng WebDriver, khai báo một số hàm JavaScript và thực thi JavaScript bằng WebDriver
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
5Một vấn đề khác gặp phải thường xuyên hơn là nhu cầu cuộn xuống cuối trang web. Bạn có thể thực hiện thao tác này trong một dòng mã
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
6Ngoài ra, bạn có thể có nhiều hơn một hành động JavaScript trong câu lệnh của mình
Ví dụ
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
7Trong trường hợp này, việc sử dụng thứ tự các phần tử web rất quan trọng. Truy cập
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
2 với javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
3 bất kỳ đâu trong câu lệnh JavaScript sẽ truy xuất trang web đầu tiên . javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
0Cách trả về giá trị
Một khía cạnh quan trọng khác của trình thực thi JavaScript là nó có thể được sử dụng để tìm nạp các giá trị từ các phần tử web. Điều đó có nghĩa là phương thức
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
1 có thể trả về giá trị. Ví dụ
javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
0Lưu ý rằng nếu bạn muốn thứ gì đó được mã JavaScript trả về, bạn cần sử dụng return. Ngoài ra, các phần tử có thể được định vị bằng Selenium và được chuyển vào tập lệnh
Điều gì xảy ra khi một phần tử không được tìm thấy?
Khi JavaScript không thể tìm thấy một phần tử để hoạt động, nó sẽ đưa ra một ngoại lệ WebDriver với thông báo lỗi tương ứng
Kịch bản 1. Chúng tôi đang cố gắng đọc thuộc tính bằng cách sử dụng '
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
5 ' nhưng không có phần tử nào như vậy trên trang web. Chúng tôi nhận được thông báo sau trong dấu vết ngoại lệ. javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
1Kịch bản 2. Chúng tôi đang cố gắng sử dụng tên hàm báo lỗi hoặc thao tác không hợp lệ bên trong JavaScript, chẳng hạn như '
userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
6 '. [Lưu ý lỗi chính tả trong userName = driver.find_element_by_xpath["//button[@name='username']"]
driver.execute_script["arguments[0].click[];", userName]
7 tên phương thức. ]javaScript = "document.getElementsByName['username'][0].click[];"
driver.execute_script[javaScript]
2Tóm lược
Dưới đây là tóm tắt về một vài hành động tiềm năng mà JavaScript có thể được sử dụng
lấy phần tử văn bản hoặc thuộc tính
tìm một phần tử
thực hiện một số thao tác trên một phần tử, chẳng hạn như
7userName = driver.find_element_by_xpath["//button[@name='username']"] driver.execute_script["arguments[0].click[];", userName]
thay đổi thuộc tính của một phần tử
cuộn đến một phần tử hoặc vị trí trên trang web
đợi cho đến khi trang được tải
Kiến thức cơ bản về JavaScript giúp ích rất nhiều khi xử lý DOM với Selenium. Bạn có thể tìm thêm chi tiết và bài viết trên trang web allselenium